PHPの開発中、「スパースアレイ」を作成する必要があるシナリオに遭遇することがよくあります。つまり、配列の特定の特定のインデックスのみが値を持ち、他の部品は空または未定義です。 PHPでは、スパースアレイは手動での割り当てによって実装できますが、一部の開発者はarray_fill()関数を使用してこのプロセスを簡素化しようとしました。それで、 array_fill()はスパースアレイの作成に本当に適していますか?その場で分析しましょう。
array_fill()は、配列をすばやく入力するための関数です。基本的な構文は次のとおりです。
array array_fill ( int $start_index , int $count , mixed $value )
$ start_index :indexを開始します。
$ count :埋める要素の数。
$値:各要素の値。
例えば:
$result = array_fill(5, 3, 'test');
print_r($result);
出力は次のとおりです。
Array
(
[5] => test
[6] => test
[7] => test
)
ご覧のとおり、インデックス5から始まる値「テスト」が3つの要素を埋めます。
スパースアレイのコア機能は、インデックス間に「穴」がある可能性があることです。たとえば、アレイにはインデックス3、15、および1000に値が必要になる場合がありますが、残りは空または定義されていないままです。
スパースアレイを手動で構築することは、次のようになる場合があります。
$data = [];
$data[3] = 'alpha';
$data[15] = 'beta';
$data[1000] = 'gamma';
このアプローチは非常に直感的であり、配列自体はあまり多くのスペースを占有しません。なぜなら、PHPのアレイは本質的に順序付けられたマップ(ハッシュテーブル)であり、未定義のインデックスは実際にはメモリを引き上げることはないからです。
理論的には、 array_fill()を使用して、特定の連続スパースセグメントを作成できます。例えば:
$data = array_fill(1000, 1, 'only_one');
出力:
Array
(
[1000] => only_one
)
これにより、ハイビットインデックスで割り当てを実装しますが、複数の不連続なインデックス値を作成する場合(同時に3、15、1000の設定など)、 Array_fill()を一度に実行できません。あなたはそれを複数回呼ぶ必要があります:
$data = array_fill(3, 1, 'alpha') +
array_fill(15, 1, 'beta') +
array_fill(1000, 1, 'gamma');
これにより、必要なスパースアレイ構造が得られますが、実際には「効率的なバッチ生成」の利点が失われます。対照的に、直接的な手動の割り当てはより簡潔になります:
$data = [
3 => 'alpha',
15 => 'beta',
1000 => 'gamma'
];
array_fill()の利点は、継続的な初期化です。たとえば、:
テーブルの初期値を生成します。
特定の構造の統一初期化(0パディング、ブールパディングなど)。
初期オフセットケーブルを制御して、開始位置を引き起こします。
しかし、「不連続なインデックス」または「大きな間隔」を持つスパースアレイの必要性に直面している場合、それは最も適切なツールではありません。
array_fill()は、連続インデックスを備えたアレイをすばやく初期化するための非常に便利な機能です。しかし、典型的な「スパースアレイ」を構築するとき、それは無力のようです。ニーズが不連続なスパースアレイである場合、インデックス割り当てを直接使用する方法はより柔軟で制御可能です。
もちろん、スパースインデックスアレイを構築するための統一ロジックがある場合は、ヘルパー関数をカプセル化してarray_fill()の実装を組み合わせます。例えば:
function sparse_fill(array $indexes, $value) {
$result = [];
foreach ($indexes as $index) {
$result[$index] = $value;
}
return $result;
}
$data = sparse_fill([3, 15, 1000], 'example');
この方法は、大規模なまばらな充填ニーズにより適しており、メンテナンスが容易です。