ホームページ >バックエンド開発 >PHPチュートリアル >PHP 配列ディープ コピーの謎を解く: さまざまなメソッドの背後にある秘密

PHP 配列ディープ コピーの謎を解く: さまざまなメソッドの背後にある秘密

WBOY
WBOYオリジナル
2024-05-02 22:09:02355ブラウズ

PHP で配列のディープ コピーを実装する方法には、array_map()、PHP 組み込み関数 clone() および array_slice()、およびサードパーティ ライブラリ DeepCopy を使用した要素ごとのコピーが含まれます。要素ごとのコピーには for ループの使用が含まれ、array_map() はコールバック関数を使用し、clone() は参照を作成し、array_slice() はディープ コピーを強制します。サードパーティ ライブラリ DeepCopy はディープ コピー専用であり、複雑なシナリオで使用できます。実際のアプリケーションでは、元のショッピング カートへの影響を避けるために、ショッピング カート内のアイテムのクローンを作成するために使用できます。

PHP 配列ディープ コピーの謎を解く: さまざまなメソッドの背後にある秘密

PHP 配列ディープ コピーの謎を解く: さまざまなメソッドの背後にある秘密

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);
?>

PHP 組み込み関数を使用します: 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。