Intereting Posts
динамически вставлять данные в таблицу mysql Отправка изображения из программы C # на веб-страницу PHP для отображения как отправить html-элементы через JSON, используя php Установить начальное значение автоинкремента в Laravel 4 совместное использование файлов cookie через домены на одном хосте Копирование нескольких строк в другую таблицу как одну строку в mysql Угловая 2 POST с Firefox Ненавязчивая функция самостоятельных комментариев для размещения на существующих веб-страницах PDO и кэширование, как реализовать его в классе базы данных? MySQL Полнотекстовый поиск – поиск коротких слов График api (facebook) слишком медленный Обновление Zend_Auth_Storage после редактирования профиля пользователя Лучший способ multiInsert для добавления базы данных в php? PHP. Создайте уникальный ассоциативный массив, ключ -> значение и значение ->. Лучшая практика по окончанию if … else statement без дополнительного условия

Как перенести элемент массива с известным ключом в конец массива в PHP?

Имея мозг, замораживает довольно тривиальную проблему. Если я начну с массива вроде этого:

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

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

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

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

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

 $v = $my_array['monkey']; unset($my_array['monkey']); $my_array['monkey'] = $v; с $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($my_array, create_function('$x,$y','return ($y === "monkey") ? -1 : 1;')); 

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

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

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

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

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