Ответ 1
Единственный способ, которым я могу это сделать, - удалить его, а затем добавить:
$v = $my_array['monkey'];
unset($my_array['monkey']);
$my_array['monkey'] = $v;
Наличие мозгового замораживания над довольно тривиальной проблемой. Если я начну с такого массива:
$my_array = array(
'monkey' => array(...),
'giraffe' => array(...),
'lion' => array(...)
);
... и новые элементы могут добавляться с разными ключами, но всегда значение массива. Теперь я могу быть уверен, что первый элемент всегда будет иметь ключ "обезьяна", но я не могу быть уверенным в каких-либо других клавишах.
Когда я закончил заполнять массив, я хочу переместить известный элемент "обезьяна" в конец массива, не нарушая порядок остальных элементов. Каков наиболее эффективный способ сделать это?
Каждый способ, которым я могу думать, кажется немного неуклюжим, и я чувствую, что мне не хватает чего-то очевидного.
Единственный способ, которым я могу это сделать, - удалить его, а затем добавить:
$v = $my_array['monkey'];
unset($my_array['monkey']);
$my_array['monkey'] = $v;
array_shift, вероятно, менее эффективен, чем отменить индекс, но он работает
$my_array = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3);
$my_array['monkey'] = array_shift($my_array);
print_r($my_array);
Другая альтернатива - обратный вызов и uksort:
uksort($my_array, create_function('$x,$y','return ($y === "monkey") ? -1 : 1;'));
Вы хотите использовать правильный lambda, если используете PHP5.3 + или просто регулярно определяете функцию как глобальную функцию.
Мне действительно нравится ответ @Gordon выше за его элегантность как один вкладыш, но он работает, только если ключ находится в начале. Вот еще один вкладыш, который будет работать на ключ в любой позиции:
$arr = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3);
$arr += array_splice($arr,array_search('giraffe',array_keys($arr)),1);
РЕДАКТИРОВАТЬ: Осторожно, это не с цифровыми клавишами.
Вы можете реализовать базовое исчисление и получить универсальную функцию для перемещения элемента массива из одной позиции в другую.
Для PHP это выглядит так:
function magicFunction ($targetArray, $indexFrom, $indexTo) {
$targetElement = $targetArray[$indexFrom];
$magicIncrement = ($indexTo - $indexFrom) / abs ($indexTo - $indexFrom);
for ($Element = $indexFrom; $Element != $indexTo; $Element += $magicIncrement){
$targetArray[$Element] = $targetArray[$Element + $magicIncrement];
}
$targetArray[$indexTo] = $targetElement;
}
Для подробного объяснения посмотрите "элементы движущихся элементов" в "gloommatter".
http://www.gloommatter.com/DDesign/programming/moving-any-array-elements-universal-function.html
Вклад в принятый ответ - для того, чтобы элемент не был вставлен в ту же позицию, но был помещен в конец массива:
$v = $my_array['monkey'];
unset($my_array['monkey']);
вместо:
$my_array['monkey'] = $v;
использовать:
array_push($my_array, $v);