PHPプログラミングでは、 array_fill()は、配列を作成および埋めるための非常に実用的な機能です。その関数の署名は次のとおりです。
array array_fill(int $start_index, int $count, mixed $value)
関数は、指定された開始インデックス位置で開始し、 $ count要素を含む配列を作成し、同じ$ valueで入力することです。よくある質問は、この$値は値ごとに配列にコピーされていますか、それとも参照によって渡されますか?
array_fill()関数は、デフォルトで値ごとにコピーによって入力されます。つまり、オブジェクトまたはarrayへの参照を入力している場合、各要素は、同じ参照を共有する複数の要素ではなく、 array_fill()の個別のコピーになります。
例を見てみましょう:
$obj = new stdClass();
$obj->name = "Alice";
$filled = array_fill(0, 3, $obj);
$filled[0]->name = "Bob";
echo $filled[1]->name; // 出力 "Bob"
array_fill()は値で渡されますが、オブジェクトは参照セマンティクスに存在するため、配列内の各アイテムが同じオブジェクトを指します。オブジェクトの1つのプロパティを変更すると、他のアイテムも影響を受けます。
ただし、整数や文字列などの通常のデータ型で満たされている場合、各配列要素は独立した値です。
$filled = array_fill(0, 3, "Hello");
$filled[0] = "World";
print_r($filled);
// 出力:
// Array
// (
// [0] => World
// [1] => Hello
// [2] => Hello
// )
この例では、 Fuled [0]の変更は他の要素に影響しないため、文字列が値によってコピーされていることを示します。
値のコピーだけでなく、各配列要素を同じ変数を参照する場合は、変数を参照してarray_fill()を使用できます。例は次のとおりです。
$value = "shared";
$filled = array_fill(0, 3, &$value);
$value = "updated";
print_r($filled);
// 出力:
// Array
// (
// [0] => updated
// [1] => updated
// [2] => updated
// )
この例では、参照として明示的に$値を使用すると、配列内の各要素は同じ変数$値にバインドされています。 $値への変更は、配列内の各アイテムに同期して反映されます。
ただし、この方法はPHPでは一般的ではなく、予期しない動作を引き起こす傾向があることに注意してください。一般に、複数の配列アイテムが実際に同じリファレンスを共有する必要がある場合にのみ推奨されます。
array_fill()のデフォルトの動作は、値ごとにコピーすることです。
$ valueがオブジェクトまたは配列である場合、コピーされたものは実際には参照です(オブジェクトは常にPHPで参照で渡されるため)。
使用&$値を使用して、真の共有リファレンスを実装することを強制できます。
困難なデバッグの問題を引き起こすことを避けるために、参照を慎重に使用してください。
array_fill()の充填メカニズムの正確な理解は、実際のプロジェクトの潜在的な論理エラーを回避するのに役立ちます。キャッシュの初期化、プレースホルダー構造、バッチ構成と同様の機能モジュールを開発している場合、これらの違いをマスターすることが特に重要です。
例えば:
$placeholders = array_fill(0, 10, "http://m66.net/placeholder");
上記のコードは、値からコピーされ、参照を共有しない10個の固定URLの配列を装着します。
これらの根本的なメカニズムを理解することにより、アレイの動作をより正確に制御し、コードの堅牢性と保守性を向上させることができます。