web-dev-qa-db-ja.com

php array_merge連想配列

連想配列の先頭にアイテムを追加しようとしています。これを行う最善の方法は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私がやろうとしていることを達成するために、配列の先頭に新しい項目を追加する別の方法はありますか?

24
stephenbayer

docs から:

最初の配列の要素を上書きせず、インデックスを再作成せずに、2番目の配列の配列要素を最初の配列に追加する場合は、+配列の結合演算子を使用します。

最初の配列引数のキーは、+ユニオン演算子を使用するときに保持されるため、引数の順序を逆にしてユニオン演算子を使用すると、必要な処理を実行できます。

$products = $products + array(0 => "Select a product");
51
Mark Elliot

それを楽しむためだけに

$newArray = array_combine(array_merge(array_keys($array1),
                                      array_keys($array2)
                                     ),
                          array_merge(array_values($array1),
                                      array_values($array2)
                                     )
                         );
6
Mark Baker

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;
4
vbence

配列演算子 を使用できます:+

$products = array(0 => "Select a product" ) + $products;

ユニオンを実行し、キーが重複しない場合にのみ機能します。

2
Bob Fanger

docs から:

数値キーのある入力配列の値は、結果配列のゼロから始まる増分キーで番号が付け直されます。

1
Daniel Dinu

あなたは何かを試すことができます

$products[0]='Select a Product'
ksort($products);

これにより、配列の先頭に0が配置されますが、他の製品は不要な数値順に並べ替えられます。

0
Belinda

あなたは見たいと思う 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は上書きします。

0
davisca