27

連想配列の先頭に項目を追加しようとしています。これを行う最善の方法はarray_mergeを使用することだと思いましたが、奇妙な結果が得られました。mysql データベースから製品の ID と名前を取得すると、次のように連想配列として返されます (返される実際のデータではなく、データがおおよそどのように見えるかを表すこの質問のサンプル データです)。

$products = array (1 => 'Product 1', 42 => 'Product 42', 100 => 'Product 100');

これは、キーを値に関連付けるドロップダウンを作成するために html ヘルパーに送信され、配列項目の値がドロップダウン選択コントロールのテキストとして設定されます。最初の項目は、キーが 0 の「Please Select」のようなものにする必要があるため、次のようにしました。

$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を連想配列で適切に使用できると言われましたが、キーがintであるため、配列を真の連想配列として扱っておらず、上記のように圧縮していないと思います。

問題は、array_merge 関数が項目のキーを変更するのはなぜですか? これを行わないようにすることはできますか?または、配列の先頭に新しい項目を追加するために、私がやろうとしていることを達成する別の方法はありますか?

4

7 に答える 7

56

From the docs:

If you want to append array elements from the second array to the first array while not overwriting the elements from the first array and not re-indexing, use the + array union operator

The keys from the first array argument are preserved when using the + union operator, so reversing the order of your arguments and using the union operator should do what you need:

$products = $products + array(0 => "Select a product");
于 2011-03-08T14:22:53.300 に答える
6

Just for the fun of it

$newArray = array_combine(array_merge(array_keys($array1),
                                      array_keys($array2)
                                     ),
                          array_merge(array_values($array1),
                                      array_values($array2)
                                     )
                         );
于 2011-03-08T14:31:21.390 に答える
4

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;
于 2011-03-08T14:33:09.783 に答える
2

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

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

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

于 2011-03-08T14:27:22.697 に答える
1

ドキュメントから:

数値キーを持つ入力配列の値は、結果配列のゼロから始まるインクリメント キーで再番号付けされます。

于 2011-03-08T14:24:22.340 に答える
0

次のようなものを試すことができます

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

これにより、配列の先頭に 0 が配置されますが、他の製品も番号順に並べ替えられますが、これは望ましくない場合があります。

于 2011-03-08T14:39:31.927 に答える
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 は上書きします。

于 2015-03-06T10:28:59.267 に答える