現在の位置: ホーム> 最新記事一覧> なぜarray_fill()マニュアルループの割り当てを交換できないのですか?

なぜarray_fill()マニュアルループの割り当てを交換できないのですか?

M66 2025-06-05

PHPでは、 array_fill()は、指定された長さと指定された値の配列を迅速に生成できる非常に実用的な関数です。例えば:

 $filledArray = array_fill(0, 5, 'm66.net');
// 出力: ['m66.net', 'm66.net', 'm66.net', 'm66.net', 'm66.net']

表面的には、多くのシナリオで従来の手動ループ割り当て方法を置き換えることができます。ただし、実際の開発では、 array_fill()はマニュアルループを完全に置き換えることはできず、そのアプリケーションと柔軟性の範囲には特定の制限があります。次に、 array_fill()の制限と、マニュアルループの割り当てがより適しているシナリオについて説明します。

1。array_fill ()の制限

1.値が参照オブジェクトである場合、問題が発生します

オブジェクトをarray_fill()で埋めると、同じオブジェクト参照が配列に繰り返し入力されます。これは、要素の変更が変更されることを意味します。

 $obj = new stdClass();
$obj->url = 'https://m66.net';

$array = array_fill(0, 3, $obj);

$array[0]->url = 'https://m66.net/changed';

print_r($array); // のすべての要素 url すべてに変わりました 'https://m66.net/changed'

**なぜ? **すべての要素は同じ$ objへの参照であるためです。

手動ループ割り当てを使用する場合、この問題を回避するために、毎回新しいインスタンスを生成できます。

 $array = [];
for ($i = 0; $i < 3; $i++) {
    $obj = new stdClass();
    $obj->url = 'https://m66.net';
    $array[] = $obj;
}

2。カスタムキー名が必要な場合

array_fill()の最初のパラメーターは開始インデックスであり、非数値キー名としてカスタマイズすることはできません。例えば:

 // 生成したい ['home' => 'm66.net', 'about' => 'm66.net'] それをすることは不可能です

現時点では、手動方法のみを使用できます。

 $keys = ['home', 'about'];
$array = [];

foreach ($keys as $key) {
    $array[$key] = 'https://m66.net';
}

3.値に依存するインデックスまたはキー名が動的に生成された場合

配列値がインデックスに関連している場合、たとえば、インデックスに基づいてURLを生成する必要があります。

 $array = [];
for ($i = 1; $i <= 5; $i++) {
    $array[] = 'https://m66.net/page/' . $i;
}

array_fill()は固定値のみをサポートし、この動的ロジックを処理できません。

4.複雑な構造を扱う場合

ネストされたアレイまたはオブジェクトアレイを構築するために、手動ループにより制御可能性が向上します。例えば:

2.手動サイクリック割り当てがより適切な典型的なシナリオ

シーン理由
オブジェクト配列参照再利用によって引き起こされる副作用を避けてください
動的コンストラクト値ループロジックを介してコンテンツの生成をサポートします
非価値のキー名array_fill()は、文字列キーをサポートしません
ネストされた構造または複雑なデータ構造構造の柔軟な制御
他のデータソースと対話しますたとえば、データベースとAPIからデータを動的に読み取り、配列を入力します