php array_merge ассоциативные массивы - PullRequest
23 голосов
/ 08 марта 2011

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

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

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

Ответы [ 7 ]

50 голосов
/ 08 марта 2011

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

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

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

$products = $products + array(0 => "Select a product");
6 голосов
/ 08 марта 2011

Просто для удовольствия

$newArray = array_combine(array_merge(array_keys($array1),
                                      array_keys($array2)
                                     ),
                          array_merge(array_values($array1),
                                      array_values($array2)
                                     )
                         );
4 голосов
/ 08 марта 2011

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;
2 голосов
/ 08 марта 2011

Вы можете использовать оператор массива : +

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

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

1 голос
/ 08 марта 2011

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

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

0 голосов
/ 06 марта 2015

Вы, мужчина, хотите посмотреть на 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 голосов
/ 08 марта 2011

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

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

Это должно поставить 0 в начале массива, но оно также отсортирует другие продукты в числовом порядке, который вам может не понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...