I\'m trying to prepend an item to the beginning of an associative array. I figured the best way to do this is to use array_merge, but I\'m having some odd consequences. I
array_merge
will recalculate numeric indexes. Because your associative array iuses numeric indexes they will get renumbered. You either insert a non-numeric charadter in front of the indices like:
$products = array ('_1' => 'Product 1', '_42' => 'Product 42', '_100' => 'Product 100');
Or you can create the resulting array manually:
$newproducts = array (0 => "Select a product");
foreach ($products as $key => $value)
$newproducts[$key] = $value;
You could use array operator: +
$products = array(0 => "Select a product" ) + $products;
it will do a union and only works when the keys don't overlap.
You man want to look at array_replace function.
In this example they are function the same:
$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"
}
However they differ if the same key is present in both arrays: + operator does not overwrite the value, array_replace does.
You could try something like
$products[0]='Select a Product'
ksort($products);
That should put the 0 at the start of the array but it will also sort the other products in numeric order which you may not want.
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");
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)
)
);