Про array_merge

Прислано: orangeudav

чт, 15/07/2010 - 22:32

Про php-функцию array_merge много написано в комментариях на ее странице документации. Я же (убив кучу времени) обнаружил странное ее поведение. В некоторых случаях функция ломает кастомные индексы элементов массива, сбрасывая их в стандартные 0, 1, 2, 3 ... n. Первый раз такое увидел.

<?php
function xxx_wizard_helper() {
  
$vocs taxonomy_get_vocabularies();
  
$res = array();
  foreach (
$vocs as $vid => $voc) {
    
$res[-$vid] = '================> ' $voc->name ' <================';
    
$tr taxonomy_get_tree($vid);
    foreach (
$tr as $ttr) {
      
$res[$ttr->tid] = str_repeat('  -  '$ttr->depth) . $ttr->name ' ' $ttr->tid;
    }
  }
  return 
$res;
}

function 
xxx_wizard_for_select() {
  
$terms xxx_wizard_helper();
  
$terms_with_none array_merge(array('0' => 'Выберите термин'), $terms); // <===== тут то и происходит эпик фейл
  
return $terms_with_none;
}
?>

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано Ch в пт, 16/07/2010 - 03:49.

Вроде, так и должно быть

php.net/manual/en/function.array-merge.php написал(а):

If all of the arrays contain only numeric keys, the resulting array is given incrementing keys starting from zero.

php.su/functions/?array_merge написал(а):

Не забывайте, что числовые ключи будут перенумерованы!

Можно обойтись без array_merge:
$terms_with_none = array('0' => 'Выберите термин') + $terms;

Кстати, для для построения выпадающего списка для одного словаря есть  такая функция.


Опубликовано Mirocow в пн, 06/09/2010 - 17:18.

а почему не так?
$terms_with_none = array_merge($terms, array('0' => 'Выберите термин'));

Ведь сорс то у нас как раз уже заполнен и это переменная а в твоем лучае это не прокатит кстати.
Вот такое решение будет работать верно.

$arr = array('0' => 'Выберите термин');
$terms_with_none = array_merge($arr, $terms);


Опубликовано Mirocow в вт, 07/09/2010 - 09:36.

А отличие array_merge от +, то что при операторе + дублирующиеся ключи не будут перезаписаны, недостающие будут добавлены.

Array Union: The + operator appends elements of remaining keys from the right handed array to the left handed, whereas duplicated keys are NOT overwritten.
array_merge(): If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. If, however, the arrays contain numeric keys, the later value will not overwrite the original value, but will be appended. If all of the arrays contain only numeric keys, the resulting array is given incrementing keys starting from zero.

Так что оператор объедения + не лучший способ обойти проблему. Проще ключи преобразовать к нужному виду. Или к стрингу или к числам.


Новое на сайте

Ссылки партнёров