連想配列の先頭にアイテムを追加しようとしています。これを行う最善の方法はarray_mergeを使用することであると考えましたが、奇妙な結果が生じています。私はmysqlデータベースから製品のIDと名前を取得し、次のように連想配列として返されます(実際に返されるデータではなく、データの近似的な外観を表すこの質問のサンプルデータ)。
$products = array (1 => 'Product 1', 42 => 'Product 42', 100 => 'Product 100');
これは、キーを値に関連付けるドロップダウンを作成するためにHTMLヘルパーに送信され、配列項目の値はドロップダウン選択コントロールのテキストとして設定されます。最初の項目は、「選択してください」のようなキー0にする必要があるため、次のようにしました。
$products = array_merge(array(0 => "Select a product" ), $products);
結果の配列は次のようになります。
array(
0 => 'Select a product',
1 => 'Product 1',
2 => 'Product 42',
3 => 'Product 100'
);
私が本当に欲しかったのは、連想配列のキーを失うことではありませんでした。私が試した方法で連想配列でarray_mergeを適切に使用できると言われましたが、私のキーはintsであるため、配列を真の連想配列として処理していないため、それらを圧縮しています上記のように。
問題は、なぜarray_merge関数がアイテムのキーを変更するのかということです。これを行わないようにできますか? OR私がやろうとしていることを達成するために、配列の先頭に新しい項目を追加する別の方法はありますか?
docs から:
最初の配列の要素を上書きせず、インデックスを再作成せずに、2番目の配列の配列要素を最初の配列に追加する場合は、+配列の結合演算子を使用します。
最初の配列引数のキーは、+
ユニオン演算子を使用するときに保持されるため、引数の順序を逆にしてユニオン演算子を使用すると、必要な処理を実行できます。
$products = $products + array(0 => "Select a product");
それを楽しむためだけに
$newArray = array_combine(array_merge(array_keys($array1),
array_keys($array2)
),
array_merge(array_values($array1),
array_values($array2)
)
);
array_merge
は数値インデックスを再計算します。連想配列は数値インデックスを使用しているため、番号が付け直されます。次のようなインデックスの前に非数値文字を挿入するか、
$products = array ('_1' => 'Product 1', '_42' => 'Product 42', '_100' => 'Product 100');
または、結果の配列を手動で作成できます。
$newproducts = array (0 => "Select a product");
foreach ($products as $key => $value)
$newproducts[$key] = $value;
配列演算子 を使用できます:+
$products = array(0 => "Select a product" ) + $products;
ユニオンを実行し、キーが重複しない場合にのみ機能します。
docs から:
数値キーのある入力配列の値は、結果配列のゼロから始まる増分キーで番号が付け直されます。
あなたは何かを試すことができます
$products[0]='Select a Product'
ksort($products);
これにより、配列の先頭に0が配置されますが、他の製品は不要な数値順に並べ替えられます。
あなたは見たいと思う array_replace
関数。
この例では、機能は同じです。
$products1 = array (1 => 'Product 1', 42 => 'Product 42', 100 => 'Product 100');
$products2 = array (0 => 'Select a product');
$result1 = array_replace($products1, $products2);
$result2 = $products1 + $products2;
Result for both result1 and result2: Keys are preserved:
array(4) {
[1] => string(9) "Product 1"
[42] => string(10) "Product 42"
[100] => string(11) "Product 100"
[0] => string(16) "Select a product"
}
ただし、両方の配列に同じキーが存在する場合は異なります。+演算子は値を上書きせず、array_replaceは上書きします。