Как добавить новую пару [ключ] => [значение] после определенного ассоциативного ключа в массиве Assoc в PHP?

Возможный дубликат:
array_splice() для ассоциативных массивов
Как добавить значение массива в середину ассоциативного массива?

Как я могу добавить новую пару [key] => [value] после определенного ассоциативного ключа в массиве Assoc в PHP?

Например, предположим, что у нас есть массив с именем $fruits:

array {
   [apple] => 1
   [banana] => 3
   [orange] => 4
}

Как я могу добавить [plum] => 2 к $fruits, чтобы он отображался после ключа [apple], но перед ключом [banana]?

Спасибо.


person ProgrammerGirl    schedule 03.02.2012    source источник
comment
В этом примере похоже, что вы хотите отсортировать массив в порядке возрастания значений, сохраняя индекс, он же asort. us.php.net/asort   -  person MetalFrog    schedule 03.02.2012


Ответы (3)


Вероятно, вам придется использовать array_splice(), чтобы разрезать массив на две части, а затем воссоздать массив с помощью array_merge(). Попробуйте эту изящную функцию, которую я только что придумал.

Живой пример: http://codepad.org/gGm5C1od

<?php
   $orig = array(
       "apple" => 1,
       "banana" => 3,
       "orange" => 4,
   );

   $orig = InsertKeyValuePair($orig, "plum", 2, 1);
   var_dump($orig);

   function InsertKeyValuePair($arr, $key, $val, $index){
      $arrayEnd = array_splice($arr, $index);
      $arrayStart = array_splice($arr, 0, $index);   
      return (array_merge($arrayStart, array($key=>$val), $arrayEnd ));
   }

?>
person Dutchie432    schedule 03.02.2012
comment
@DaveRandom: Хороший улов на этом редактировании. Спасибо. - person Dutchie432; 03.02.2012
comment
Недействительное редактирование Сандипана Ната: /** * @desc adds an array value to the middle of an associative array * @param Array $arr - array on which to insert * @param string $key - key name to be given to the newly inserted element * @param mixed $val - value for the newly inserted element * @param int $index - at which sequence number? to insert the new array value into the original array $arr */ - person StuartLC; 30.10.2012
comment
что не так в редакции? пожалуйста, объясни @nonnb. Хотя, возможно, фразы можно было бы улучшить... - person Sandeepan Nath; 31.10.2012
comment
@SandeepanNath Редактирование вопроса или ответа должно быть незначительным, таким как форматирование или грамматика, а не добавление к ответу или добавление комментариев (используйте свой собственный ответ или добавьте комментарий для этого). Однако, поскольку ваше редактирование, казалось, содержало хороший совет, было бы трагедией потерять ваше редактирование, поэтому я вставил его под сообщением. Как видите, Датчи отменил свой ответ. - person StuartLC; 31.10.2012
comment
Хорошо, теперь ясно. Таким образом, это было Invalid в этом смысле. Спасибо - person Sandeepan Nath; 31.10.2012

Если вашей конечной целью является серийный номер (или что-то еще) фруктов на основе их имени, например, чтобы найти серийный номер яблока, вы будете использовать фрукты ['apple'], тогда не имеет значения, где существует конкретный элемент в массиве, и если вы действительно хотите сделать это по-своему, тогда вы можете использовать функцию array_splice() Вот хороший учебник http://www.ferolen.com/blog/insert-into-add-element-to-array-at-specific-position-php/

person Deepak    schedule 03.02.2012

Предположение, что массивы с ассоциативными ключами имеют предсказуемый порядок, не является хорошим дизайном. Если вам нужен принудительный порядок, вы должны указать его в своем дизайне. Например, укажите в массиве номер заказа, а затем напишите собственные функции для извлечения данных по имени фрукта.

Если вы продолжите предполагать, что ключи имеют естественный порядок, однажды вы столкнетесь со сценарием, в котором порядок может быть не таким, как вы ожидали, и у вас будут нарушены функциональные возможности.

person TravisO    schedule 03.02.2012