Про 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;
}
?>- orangeudav's blog
- Для комментирования войдите или зарегистрируйтесь
Вроде, так и должно быть
If all of the arrays contain only numeric keys, the resulting array is given incrementing keys starting from zero.
Не забывайте, что числовые ключи будут перенумерованы!
Можно обойтись без array_merge:
$terms_with_none = array('0' => 'Выберите термин') + $terms;
Кстати, для для построения выпадающего списка для одного словаря есть
такая функция.
- Для комментирования войдите или зарегистрируйтесь
а почему не так?
$terms_with_none = array_merge($terms, array('0' => 'Выберите термин'));
Ведь сорс то у нас как раз уже заполнен и это переменная а в твоем лучае это не прокатит кстати.
Вот такое решение будет работать верно.
$arr = array('0' => 'Выберите термин');
$terms_with_none = array_merge($arr, $terms);
- Для комментирования войдите или зарегистрируйтесь
А отличие 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.
Так что оператор объедения + не лучший способ обойти проблему. Проще ключи преобразовать к нужному виду. Или к стрингу или к числам.
- Для комментирования войдите или зарегистрируйтесь



Комментарии