php переместить элемент массива в конец
Как переместить элемент массива с известным ключом в конец массива в PHP?
Заморозка мозга из-за довольно тривиальной проблемы. Если я начну с массива, как это:
. и новые элементы могут быть добавлены с разными ключами, но всегда значением массива. Теперь я могу быть уверен, что у первого элемента всегда будет ключ «обезьяна», но я не могу быть уверен ни в одном из других ключей.
Когда я закончил заполнение массива, я хочу переместить известный элемент «обезьяна» в конец массива, не нарушая порядок других элементов. Как это сделать наиболее эффективно?
Каждый способ, о котором я могу думать, кажется немного неуклюжим, и мне кажется, что я упускаю что-то очевидное.
5 ответов
Вы можете реализовать некоторые базовые вычисления и получить универсальную функцию для перемещения элемента массива из одной позиции в другую.
Для PHP это выглядит так:
Проверьте «движущиеся элементы массива» в «gloommatter» для подробного объяснения.
Мне очень нравится ответ @Gordon выше за его элегантность в виде однострочника, но он работает только в том случае, если ключ находится в начале. Вот еще один лайнер, который будет работать для ключа в любом положении:
РЕДАКТИРОВАТЬ: Остерегайтесь, это не работает с цифровыми клавишами.
array_shift, вероятно, менее эффективен, чем отключение индекса, но это работает:
Если вы используете PHP5.3, вы захотите использовать правильную лямбду. + или просто регулярно определяйте функцию как глобальную.
array_unshift
(PHP 4, PHP 5, PHP 7, PHP 8)
array_unshift — Добавляет один или несколько элементов в начало массива
Описание
Список параметров
Значения для добавления.
Возвращаемые значения
Список изменений
Версия | Описание |
---|---|
7.3.0 | Теперь эта функция может быть вызвана с одним параметром. Ранее требовалось минимум два параметра. |
Примеры
Пример #1 Пример использования array_unshift()
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 12 notes
You can preserve keys and unshift an array with numerical indexes in a really simple way if you’ll do the following:
array(
100=>’Test Element 1 ‘,
255=>’Test Element 2′
224=>’someword1′,
228=>’someword2′,
102=>’someword3′,
544=>’someword3′,
95=>’someword4′
);
array_merge() will also reindex (see array_merge() manual entry), but the ‘+’ operator won’t, so.
Sahn’s example almost works but has a small error. Try it like this if you need to prepend something to the array without the keys being reindexed and/or need to prepend a key value pair, you can use this short function:
Anonymous’ associative version wasn’t working for me, but it did with this small tweak:
Another way to tack something to the beginning of an array is with array_merge().
$plans = array(‘AARP’=>’Senior’, ‘AAA’=>’Automobile Club’);
Actually this problem with the keys getting reindexed only happens when the keys are numerical:
k: f v: five
k: s v: six
k: t v: twenty
Array
(
[0] => zero
[f] => five
[s] => six
[t] => twenty
)
k: 0 v: zero
k: f v: five
k: s v: six
k: t v: twenty
This becomes a nice little problem if you index your arrays out of order (while manually sorting). For example:
[ 3 ] = ‘8/%/2006’ ;
$recordMonths [ 4 ] = ‘7/%/2004’ ;
$recordMonths [ 0 ] = ‘3/%/2007’ ;
$recordMonths [ 1 ] = ‘2/%/2007’ ;
$recordMonths [ 5 ] = ’12/%/2000′ ;
$recordMonths [ 6 ] = ’11/%/2000′ ;
$recordMonths [ 7 ] = ’10/%/2000′ ;
$recordMonths [ 2 ] = ‘1/%/2007’ ;
singleMonth: 3/%/2007
singleMonth: 2/%/2007
singleMonth: 1/%/2007
singleMonth: 8/%/2006
singleMonth: 7/%/2004
singleMonth: 12/%/2000
singleMonth: 11/%/2000
singleMonth: 10/%/2000
singleMonth: %
singleMonth: 8/%/2006
singleMonth: 7/%/2004
singleMonth: 3/%/2007
singleMonth: 2/%/2007
singleMonth: 12/%/2000
singleMonth: 11/%/2000
singleMonth: 10/%/2000
singleMonth: 1/%/2007
It reindexes them based on the order they were created. It seems like if an array has all numeric indexes, then it should reindex them based on the order of their index. Just my opinion.
If you need to prepend something to the array without the keys being reindexed and/or need to prepend a key value pair, you can use this short function:
If you need to change the name of a key without changing its position in the array this function may be useful.
I had a need tonight to convert a numeric array from 1-based to 0-based, and found that the following worked just fine due to the «side effect» of renumbering:
Last version of PHP deprecated unshifting of a reference.
You can use this function instead :
Как перенести элемент массива с известным ключом в конец массива в PHP?
Имея мозг, замораживает довольно тривиальную проблему. Если я начну с массива вроде этого:
… и новые элементы могут добавляться с разными ключами, но всегда значение массива. Теперь я могу быть уверен, что первый элемент всегда будет иметь ключ «обезьяна», но я не могу быть уверенным в каких-либо других ключах.
Когда я закончил заполнять массив, я хочу переместить известный элемент «обезьяна» в конец массива, не нарушая порядок остальных элементов. Каков наиболее эффективный способ сделать это?
Каждый способ, о котором я могу думать, кажется немного неуклюжим, и я чувствую, что мне не хватает чего-то очевидного.
Единственный способ, который я могу сделать, это удалить его, а затем добавить:
Другой альтернативой является обратный вызов и подтверждение :
Вы будете использовать правильную лямбду, если используете PHP5.3 + или просто определяете функцию как глобальную функцию регулярно.
Вы можете реализовать некоторое базовое исчисление и получить универсальную функцию для перемещения элемента массива из одного положения в другое.
Для PHP это выглядит так:
Для подробного объяснения ознакомьтесь с «перемещением элементов массива» в «gloommatter».
Мне очень нравится, что @ Гордон ответил выше, потому что это элегантность как один лайнер, но он работает только в том случае, если ключ находится в начале. Вот еще один лайнер, который будет работать для ключа в любой позиции:
Функции для работы с массивами
Содержание
User Contributed Notes 14 notes
A simple trick that can help you to guess what diff/intersect or sort function does by name.
Example: array_diff_assoc, array_intersect_assoc.
Example: array_diff_key, array_intersect_key.
Example: array_diff, array_intersect.
Example: array_udiff_uassoc, array_uintersect_assoc.
This also works with array sort functions:
Example: arsort, asort.
Example: uksort, ksort.
Example: rsort, krsort.
Example: usort, uasort.
?>
Return:
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Cuatro [ 4 ] => Cinco [ 5 ] => Tres [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
Array ( [ 0 ] => Cero [ 1 ] => Uno [ 2 ] => Dos [ 3 ] => Tres [ 4 ] => Cuatro [ 5 ] => Cinco [ 6 ] => Seis [ 7 ] => Siete [ 8 ] => Ocho [ 9 ] => Nueve [ 10 ] => Diez )
?>
Updated code of ‘indioeuropeo’ with option to input string-based keys.
Here is a function to find out the maximum depth of a multidimensional array.
// return depth of given array
// if Array is a string ArrayDepth() will return 0
// usage: int ArrayDepth(array Array)
Short function for making a recursive array copy while cloning objects on the way.
If you need to flattern two-dismensional array with single values assoc subarrays, you could use this function:
to 2g4wx3:
i think better way for this is using JSON, if you have such module in your PHP. See json.org.
to convert JS array to JSON string: arr.toJSONString();
to convert JSON string to PHP array: json_decode($jsonString);
You can also stringify objects, numbers, etc.
Function to pretty print arrays and objects. Detects object recursion and allows setting a maximum depth. Based on arraytostring and u_print_r from the print_r function notes. Should be called like so:
I was looking for an array aggregation function here and ended up writing this one.
Note: This implementation assumes that none of the fields you’re aggregating on contain The ‘@’ symbol.
While PHP has well over three-score array functions, array_rotate is strangely missing as of PHP 5.3. Searching online offered several solutions, but the ones I found have defects such as inefficiently looping through the array or ignoring keys.
Массивы в PHP
Что такое массив
Например, так можно объявить массив с тремя значениями:
Массивы также отлично подходят для объединения нескольких связанных между собой значений, например характеристик товара:
Создание массива
Для создания пустого массива просто укажите квадратные скобки вместо значения:
Результат в браузере:
PHP сообщает нам, что в переменной лежит массив (англ. array), в котором находится 0 значений.
Чтобы объявить массив с данными, просто перечислите значения в квадратных скобках:
Создание массивов с помощью квадратных скобок работает начиная с версии PHP 5.4. До этого использовался более громоздкий синтаксис:
Ключи и значения массива
Массив состоит из ключей (индексов) и соответствующих им значений. Это можно представить как таблицу:
Ключ | Значение |
---|---|
0 | Samsung |
1 | Apple |
2 | Nokia |
У каждого значения есть свой ключ. В массиве не может быть несколько одинаковых ключей.
Вернёмся к предыдущему примеру и посмотрим, что лежит в массиве:
Результат в браузере:
Когда мы создаём массив без указания ключей, PHP генерирует их автоматически в виде чисел, начиная с 0.
Указание ключей происходит с помощью конструкции => :
Простые и ассоциативные массивы
Когда мы создаём массив с числовыми ключами, такой массив называется простым или числовым.
Вывод массива
Вывод элементов массива выглядит следующим образом:
Однако обе функции выводят информацию на одной строке, что в случае с массивами превращается в кашу. Чтобы этого не происходило, используйте тег ‘;
Результат в браузере:
Также вывести содержимое массива можно с помощью цикла foreach:
Подробней работу цикла foreach мы разберём в отдельном уроке.
Добавление и удаление элементов
Добавление новых элементов в массив выглядит следующим образом:
Но если название ключа не играет роли, его можно опустить:
Удалить элемент массива можно с помощью функции unset() :
Двумерные и многомерные массивы
В качестве значения массива мы можем передать ещё один массив:
Обратиться к элементу многомерного массива можно так:
Теперь мы можем хранить в одном массиве целую базу товаров:
Или альтернативный вариант:
Задача 1
Задача 2
2. Создайте подмассив streets с любыми случайными улицами. Каждая улица должна иметь имя (name) и количество домов (buildings_count), а также подмассив из номеров домов (old_buildings), подлежащих сносу.