Ассоциативные массивы php array_merge

Я пытаюсь добавить элемент в начало ассоциативного массива. Я решил, что лучший способ сделать это – использовать array_merge, но у меня есть некоторые странные последствия. Я получаю идентификатор и имя продуктов из базы данных mysql, и он возвращается как ассоциативный массив, как это (а не фактические данные, возвращаемые назад, но пример данных для этого вопроса, который представляет собой то, что данные выглядят примерно):

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

это отправляется html-помощнику для создания раскрывающегося списка, которое связывает ключ со значением, а значение элемента массива устанавливается как текст в выпадающем элементе управления. Мне нужно, чтобы первый элемент был чем-то вроде «Please Select» с ключом 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 меняет ключи элементов? могу ли я держать это от этого? ИЛИ есть ли другой способ для меня выполнить то, что я пытаюсь сделать, добавить новый элемент в начале массива?

Из документов :

Если вы хотите добавить элементы массива из второго массива в первый массив, не переписывая элементы из первого массива, а не повторно индексируя, используйте оператор объединения массива +

Ключи от первого аргумента массива сохраняются при использовании оператора + union, поэтому изменение порядка ваших аргументов и использование оператора union должны делать то, что вам нужно:

 $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 будет пересчитывать числовые индексы. Поскольку ваш ассоциативный массив меняет числовые индексы, они будут перенумерованы. Вы либо вставляете нечисловой charadter перед такими индексами, как:

 $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; 

он будет делать соединение и работает только тогда, когда ключи не перекрываются.

Из документов :

Значения во входном массиве с числовыми клавишами будут перенумерованы с добавочными клавишами, начиная с нуля в массиве результатов.

Вы можете попробовать что-то вроде

 $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.