Как мне переместить элемент массива с известным ключом в конец массива в PHP? - PullRequest
46 голосов
/ 02 марта 2010

Заморозка мозга из-за довольно тривиальной проблемы. Если я начну с массива, как это:

$my_array = array(
                  'monkey'  => array(...),
                  'giraffe' => array(...),
                  'lion'    => array(...)
);

... и новые элементы могут добавляться с разными ключами, но всегда со значением массива. Теперь я могу быть уверен, что у первого элемента всегда будет ключ «обезьяна», но я не могу быть уверен ни в одном из других ключей.

Когда я закончу заполнение массива, я хочу переместить известный элемент 'обезьяна' в конец массива, не нарушая порядок других элементов. Какой самый эффективный способ сделать это?

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

Ответы [ 5 ]

86 голосов
/ 02 марта 2010

Единственный способ сделать это - удалить его и добавить:

$v = $my_array['monkey'];
unset($my_array['monkey']);
$my_array['monkey'] = $v;
8 голосов
/ 02 марта 2010

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;'));

Вы захотите использовать правильную лямбду , если вы используете PHP5.3 + или просто регулярно определяете функцию как глобальную функцию.

3 голосов
/ 21 июня 2017

Мне очень нравится ответ @ Гордона выше, потому что он элегантен как один вкладыш, но он работает, только если ключ находится в начале. Вот еще один вкладыш, который будет работать для ключа в любой позиции:

$arr = array('monkey' => 1, 'giraffe' => 2, 'lion' => 3);
$arr += array_splice($arr,array_search('giraffe',array_keys($arr)),1);

РЕДАКТИРОВАТЬ: Осторожно, это не с цифровыми клавишами.

1 голос
/ 09 августа 2018

Вклад в принятый ответ - чтобы элемент не вставлялся в ту же позицию, а был помещен в конец массива:

$v = $my_array['monkey'];
unset($my_array['monkey']);

вместо:

$my_array['monkey'] = $v;

использование:

array_push($my_array, $v);
1 голос
/ 05 июля 2012

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

Для 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

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