Ассоциативные массивы 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 меняет ключи элементов? могу ли я держать это от этого? ИЛИ есть ли другой способ для меня выполнить то, что я пытаюсь сделать, добавить новый элемент в начале массива?
Ответы
Ответ 1
Из docs:
Если вы хотите добавить элементы массива из второго массива в первый массив, не перезаписывая элементы из первого массива, а не повторно индексируя, используйте оператор объединения массива
Ключи от первого аргумента массива сохраняются при использовании оператора объединения +
, поэтому изменение порядка ваших аргументов и использование оператора объединения должны делать то, что вам нужно:
$products = $products + array(0 => "Select a product");
Ответ 2
Просто для удовольствия от него
$newArray = array_combine(array_merge(array_keys($array1),
array_keys($array2)
),
array_merge(array_values($array1),
array_values($array2)
)
);
Ответ 3
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;
Ответ 4
Вы можете использовать оператор массива: +
$products = array(0 => "Select a product" ) + $products;
он сделает объединение и работает только тогда, когда клавиши не перекрываются.
Ответ 5
Из docs:
Значения во входном массиве с числовыми клавишами будут перенумерованы с помощью инкрементных клавиш начиная с нуля в массиве результатов.
Ответ 6
Вы можете попробовать что-то вроде
$products[0]='Select a Product'
ksort($products);
Это должно положить 0 в начале массива, но оно также будет сортировать другие продукты в числовом порядке, который вам может не понадобиться.
Ответ 7
Вы хотите посмотреть на функцию 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 делает.