現在の位置: ホーム> 最新記事一覧> array_fill()充填値の共有参照によって引き起こされる問題を回避する方法は?

array_fill()充填値の共有参照によって引き起こされる問題を回避する方法は?

M66 2025-06-05

PHPでは、 array_fill()関数は通常、アレイをすばやく入力するために使用されます。これは、開始インデックス、配列の長さ、および塗りつぶしの値の3つのパラメーターを受け入れます。参照タイプデータで配列を埋めると、参照共有の問題に遭遇する可能性があります。つまり、配列内の要素を変更すると、同じ参照を共有するため、他の要素の値に影響を与える可能性があります。

参照共有の問題の例

<?php
// 配列を定義します
$reference = [];
// 使用 array_fill 配列を埋めます
$size = 5;
$reference = array_fill(0, $size, []);

// 配列の最初の要素を変更します
$reference[0]['name'] = 'John';

// 配列を印刷します
print_r($reference);
?>

上記のコードを実行すると、すべての充填要素が実際に同じ配列参照を指していることがわかります。そのため、 $参照[0]を変更した後、他のすべての要素も変更されます。これが引用共有の問題の根本原因です。

解決

array_fill()が配列を埋めるときに参照共有の問題を回避するために、各配列要素に独立したコピーがあることを確認するために使用できるいくつかの異なる手法があります。

方法1: array_map()を使用して、匿名関数を組み合わせます

一般的な解決策は、匿名関数を使用してarray_map()を使用して、各要素の新しい配列コピーを作成することです。これにより、参照共有の問題が回避されます。

 <?php
// 配列のサイズを定義します
$size = 5;
// 使用 array_map 配列を埋めます,各要素の新しい配列コピーを作成します
$reference = array_map(function() {
    return []; // 新しい空の配列を返します
}, array_fill(0, $size, null));

// 配列の最初の要素を変更します
$reference[0]['name'] = 'John';

// 配列を印刷します
print_r($reference);
?>

このメソッドは、 array_map()を介して各配列要素の新しい配列を作成するため、参照共有の問題を回避します。

方法2:アレイを手動で埋めます

別の方法は、アレイを手動で埋め込むことで、参照共有の問題を避けることです。この方法は、 array_fill()に依存するのではなく、 foreachまたはループを使用して配列を1つずつ埋めます。

 <?php
// 配列のサイズを定義します
$size = 5;
// 手动配列を埋めます
$reference = [];
for ($i = 0; $i < $size; $i++) {
    $reference[] = []; // 毎回新しい空の配列を追加します
}

// 配列の最初の要素を変更します
$reference[0]['name'] = 'John';

// 配列を印刷します
print_r($reference);
?>

このアプローチの利点は、参照共有の問題を引き起こすことなく、毎回新しい配列インスタンスが作成されることです。

要約します

PHPでは、 array_fill()を使用して配列を入力する場合、充填値が参照タイプの場合、アレイ要素間で同じ参照が共有され、予期しない変更の問題が発生する場合があります。この問題を回避するために、 array_map()を使用するか、アレイを手動で入力して、各要素が個別のコピーであることを確認できます。

これらの方法を使用すると、参照共有の問題を心配することなく、アレイパディングをより安全に使用できます。