PHP で配列のディープ コピーを実装する方法には、array_map()、PHP 組み込み関数 clone() および array_slice()、およびサードパーティ ライブラリ DeepCopy を使用した要素ごとのコピーが含まれます。要素ごとのコピーには for ループの使用が含まれ、array_map() はコールバック関数を使用し、clone() は参照を作成し、array_slice() はディープ コピーを強制します。サードパーティ ライブラリ DeepCopy はディープ コピー専用であり、複雑なシナリオで使用できます。実際のアプリケーションでは、元のショッピング カートへの影響を避けるために、ショッピング カート内のアイテムのクローンを作成するために使用できます。
PHP では、配列は広く使用されているユニバーサル変数タイプです。配列とその要素を操作する必要がある場合は、元の配列に対する意図しない副作用による変更を避けるために、それらのコピーを作成する必要があります。 PHP にはディープ コピーを実装するためのいくつかの方法が用意されており、それぞれに独自の長所と短所があります。
for
ループの使用最も基本的な方法は、for
ループを使用して配列を走査し、要素ごとにコピーを作成します。コード例は次のとおりです。
<?php $originalArray = [1, 2, ['a', 'b']]; $newArray = []; for ($i = 0; $i < count($originalArray); $i++) { if (is_array($originalArray[$i])) { $newArray[$i] = []; for ($j = 0; $j < count($originalArray[$i]); $j++) { $newArray[$i][$j] = $originalArray[$i][$j]; } } else { $newArray[$i] = $originalArray[$i]; } } print_r($originalArray); print_r($newArray); ?>
array_map()
array_map()
関数を使用すると、カスタム コールバックを適用するより簡潔な方法が提供されます。配列内の各要素に関数を適用します。ディープ コピーを実行するには、コールバック関数を ID 関数として設定できます:
<?php $originalArray = [1, 2, ['a', 'b']]; $newArray = array_map(function($item) { return is_array($item) ? array_map(__FUNCTION__, $item) : $item; }, $originalArray); print_r($originalArray); print_r($newArray); ?>
clone()
および array_slice()
単純な配列の場合、clone
キーワードは、元の配列要素への参照を含む新しい配列を作成します。ただし、元の配列にネストされた配列が含まれている場合、ネストされた要素は参照されるだけで、実際にはコピーされません。
array_slice
関数を clone
とともに使用すると、ネストされた配列のディープ コピーを強制的に作成できます:
<?php $originalArray = [1, 2, ['a', 'b']]; $newArray = clone $originalArray; $newArray[2] = array_slice($newArray[2], 0); print_r($originalArray); print_r($newArray); ?>
DeepCopy
ディープ コピーを頻繁に実行する必要がある場合は、オブジェクトと配列のディープ コピーに特化した DeepCopy などのサードパーティ ライブラリを使用できます。
<?php useDeepCopy\DeepCopy; $copier = new DeepCopy(); $originalArray = [1, 2, ['a', 'b']]; $newArray = $copier->copy($originalArray); print_r($originalArray); print_r($newArray); ?>
次の例は、ディープ コピーを使用してショッピング カート内のアイテムのクローンを作成し、ショッピング カートに影響を与えずにアイテムを変更できるようにする方法を示しています。オリジナルのショッピング車:
<?php class Product { public $name; public $price; public function __construct($name, $price) { $this->name = $name; $this->price = $price; } } class Cart { private array $products; public function addProduct(Product $product) { $this->products[] = $product; } public function getProducts() { return $this->products; } public function cloneProducts() { $copier = new DeepCopy(); return $copier->copy($this->products); } } $cart = new Cart(); $cart->addProduct(new Product('Apple', 1.5)); $cart->addProduct(new Product('Banana', 2.0)); $clonedProducts = $cart->cloneProducts(); $clonedProducts[0]->price = 1.8; print_r($cart->getProducts()); print_r($clonedProducts); ?>
以上がPHP 配列ディープ コピーの謎を解く: さまざまなメソッドの背後にある秘密の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。