make array from array php
array
(PHP 4, PHP 5, PHP 7, PHP 8)
array — Создаёт массив
Описание
Создаёт массив. Подробнее о массивах читайте в разделе Массивы.
Список параметров
Наличие завершающей запятой после последнего элемента массива, несмотря на некоторую необычность, является корректным синтаксисом.
Возвращаемые значения
Примеры
Последующие примеры демонстрируют создание двухмерного массива, определение ключей ассоциативных массивов и способ генерации числовых индексов для обычных массивов, если нумерация начинается с произвольного числа.
Пример #1 Пример использования array()
Пример #2 Автоматическая индексация с помощью array()
Результат выполнения данного примера:
Этот пример создаёт массив, нумерация которого начинается с 1.
Результат выполнения данного примера:
Как и в Perl, вы имеете доступ к значениям массива внутри двойных кавычек. Однако в PHP нужно заключить ваш массив в фигурные скобки.
Пример #4 Доступ к массиву внутри двойных кавычек
Примечания
Смотрите также
User Contributed Notes 38 notes
As of PHP 5.4.x you can now use ‘short syntax arrays’ which eliminates the need of this function.
So, for example, I needed to render a list of states/provinces for various countries in a select field, and I wanted to use each country name as an label. So, with this function, if only a single array is passed to the function (i.e. «arrayToSelect($stateList)») then it will simply spit out a bunch of » » elements. On the other hand, if two arrays are passed to it, the second array becomes a «key» for translating the first array.
Here’s a further example:
$countryList = array(
‘CA’ => ‘Canada’,
‘US’ => ‘United States’);
$stateList[‘CA’] = array(
‘AB’ => ‘Alberta’,
‘BC’ => ‘British Columbia’,
‘AB’ => ‘Alberta’,
‘BC’ => ‘British Columbia’,
‘MB’ => ‘Manitoba’,
‘NB’ => ‘New Brunswick’,
‘NL’ => ‘Newfoundland/Labrador’,
‘NS’ => ‘Nova Scotia’,
‘NT’ => ‘Northwest Territories’,
‘NU’ => ‘Nunavut’,
‘ON’ => ‘Ontario’,
‘PE’ => ‘Prince Edward Island’,
‘QC’ => ‘Quebec’,
‘SK’ => ‘Saskatchewan’,
‘YT’ => ‘Yukon’);
$stateList[‘US’] = array(
‘AL’ => ‘Alabama’,
‘AK’ => ‘Alaska’,
‘AZ’ => ‘Arizona’,
‘AR’ => ‘Arkansas’,
‘CA’ => ‘California’,
‘CO’ => ‘Colorado’,
‘CT’ => ‘Connecticut’,
‘DE’ => ‘Delaware’,
‘DC’ => ‘District of Columbia’,
‘FL’ => ‘Florida’,
‘GA’ => ‘Georgia’,
‘HI’ => ‘Hawaii’,
‘ID’ => ‘Idaho’,
‘IL’ => ‘Illinois’,
‘IN’ => ‘Indiana’,
‘IA’ => ‘Iowa’,
‘KS’ => ‘Kansas’,
‘KY’ => ‘Kentucky’,
‘LA’ => ‘Louisiana’,
‘ME’ => ‘Maine’,
‘MD’ => ‘Maryland’,
‘MA’ => ‘Massachusetts’,
‘MI’ => ‘Michigan’,
‘MN’ => ‘Minnesota’,
‘MS’ => ‘Mississippi’,
‘MO’ => ‘Missouri’,
‘MT’ => ‘Montana’,
‘NE’ => ‘Nebraska’,
‘NV’ => ‘Nevada’,
‘NH’ => ‘New Hampshire’,
‘NJ’ => ‘New Jersey’,
‘NM’ => ‘New Mexico’,
‘NY’ => ‘New York’,
‘NC’ => ‘North Carolina’,
‘ND’ => ‘North Dakota’,
‘OH’ => ‘Ohio’,
‘OK’ => ‘Oklahoma’,
‘OR’ => ‘Oregon’,
‘PA’ => ‘Pennsylvania’,
‘RI’ => ‘Rhode Island’,
‘SC’ => ‘South Carolina’,
‘SD’ => ‘South Dakota’,
‘TN’ => ‘Tennessee’,
‘TX’ => ‘Texas’,
‘UT’ => ‘Utah’,
‘VT’ => ‘Vermont’,
‘VA’ => ‘Virginia’,
‘WA’ => ‘Washington’,
‘WV’ => ‘West Virginia’,
‘WI’ => ‘Wisconsin’,
‘WY’ => ‘Wyoming’);
Is there a function to make a copy of a PHP array to another?
Is there a function to make a copy of a PHP array to another?
I have been burned a few times trying to copy PHP arrays. I want to copy an array defined inside an object to a global outside it.
19 Answers 19
In PHP arrays are assigned by copy, while objects are assigned by reference. This means that:
Edit: @AndrewLarsson raises a point in the comments below. PHP has a special feature called «references». They are somewhat similar to pointers in languages like C/C++, but not quite the same. If your array contains references, then while the array itself is passed by copy, the references will still resolve to the original target. That’s of course usually the desired behaviour, but I thought it was worth mentioning.
PHP will copy the array by default. References in PHP have to be explicit.
If you have an array that contains objects, you need to make a copy of that array without touching its internal pointer, and you need all the objects to be cloned (so that you’re not modifying the originals when you make changes to the copied array), use this.
The trick to not touching the array’s internal pointer is to make sure you’re working with a copy of the array, and not the original array (or a reference to it), so using a function parameter will get the job done (thus, this is a function that takes in an array).
Note that you will still need to implement __clone() on your objects if you’d like their properties to also be cloned.
This function works for any type of array (including mixed type).
Обработка многомерных ассоциативных массивов PHP
Доброго времени суток, хабражители!
В своей статье я хочу поговорить об обработке многомерных ассоциативных массивов в PHP. На мой взгляд, не всегда удобно получать необходимую информацию из многомерного массива. Одно дело если массив двумерный:
То, конечно, получить, интересующие нас значения, легко:
Но, а если мы имеем массив n-мерный? Например, пятимерный:
То, чтобы получить значение по ключу, например, «value1», нам надо прописать такой код:
Я такую запись не назвал бы красивой, хотя она является правильной. Я предлагаю слегка сделать эту запись красивой путем приведения ее к такому виду:
Согласитесь, ведь смотрится, действительно, куда симпотичней, по сравнению со стандартной записью.
Итак, для начала нам понадобится создать класс, который будет обрабатывать наш массив. Назовем его easyArray и сделаем его одиночкой (Singleton):
После того, как наш класс стал одиночкой, добавим ему весьма важный метод, который будет записывать полученный массив в приватную переменную:
Ну а теперь мы переопределим магический метод «__get()» нашего класса. Это необходимо для того, чтобы получить желаемый нами результат. Итак:
Первым делом, мы проверяем наличие запрошенного ключа в массиве, в случае отсутствия такового, выбрасываем исключение с ошибкой «‘Отсутствует ключ (‘.$index.’) в массиве’«. Далее проверяем является ли, запрошенный ключ массивом. Если по такому ключу в массиве находится значение, то просто возвращаем это значение. А если все-таки это массив, то мы отправляем его методу «loadArray($newArray)» и возвращаем текущий объект ($this).
И, как последний штрих нашего класса, добавим метод, который будет возвращать текущий массив, с которым работает наш класс:
Итак, наш класс готов, но чтобы получить значения, теперь мы должны использовать такой код:
Стало даже длиннее, чем было. Но эта проблема решаема, и для этого нам понадобится простая функция:
Ну, а теперь проверим, что мы получили в итоге:
Помимо этого, данному классу можно передавать конфигурационные файлы типа:
Возможно я изобрел велосипед, но я думаю, что данная статья будет интересна, как новичкам, так и остальным программистам.
create array tree from array list
i have a list like this:
but way bigger so i need a efficient way to make this into a tree like structure like this:
i cannot use things like nested set or things like that becoas i can add left and right values in my database. any ideas?
9 Answers 9
oke this is how i solved it:
small fix if you need more than 1 parentid[0] element 🙂
Here is my adaptation from arthur’s rework:
I created an unusual (‘while-based’ instead of recursive) but multidimensional sorting function that walk the array until there aren’t any orphans. Here the function:
Recommendation: the key of each element of the array has to be the id fo the element itself. Example:
One way to do this is with a recursive function that first finds all the bottom values of the list, adding them to a new array. Then for each new id, you use the same function on that id, taking the returned array and stuffing it in that item’s new children array. Finally, you return your new array.
I won’t do all the work for you, but the function’s parameters will look something like:
Essentially, it’ll find all the ones with parent of 0, then for each of those it’ll find all the ones with that id as the parent, and for each of those.. so on.
The end result should be what you are looking for.
Как устроены массивы в PHP
В прошлой статье я рассказывал о переменных, теперь пойдет речь о массивах.
Что такое массивы на уровне PHP?
(на картине изображен HashTable с Bucket-ами, В. Васнецов)
А начнем вот с чего — попробуем замерить память и время, съедаемое на каждое вставляемое значение. Сделаем это с помощью таких скриптов:
(по оси X — кол-во эл-тов в массиве)
Как видно, на обоих графиках есть скачки и по потребляемой памяти и по использованному времени, и эти скачки происходят в одни и те же моменты.
Дело в том, что на уровне C (да и вообще на системном уровне), не бывает массивов, с нефиксированным размером. Каждый раз, когда вы создаете массив в C, вы должны указать его размер, чтобы система знала, сколько нужно памяти на него выделить.
Тогда как это реализовано в PHP и как объянить те скачки на графике?
Когда вы создаете пустой массив, PHP создает его с определенным размером. Если вы заполняете массив и в какой-то момент достигаете и превышаете этот размер, то создается новый массив с вдвое большим размером, все элементы копируются в него и старый массив уничтожается. Вообще, это стандартный подход.
И как это реализовано?
На самом деле, для реализации массивов в PHP, используется вполне себе стандартная структура данных Hash Table, о деталях реализации которой мы и поговорим.
Hash Table хранит в себе указатель на самое первое и последнее значения (нужно для упорядочивания массивов), указатель на текущее значение (используется для итерации по массиву, это то, что возвращает current() ), кол-во элементов, представленых в массиве, массив указателей на Bucket-ы (о них далее), и еще кое-что.
Зачем
нам
ведра нужны
и куда
нам
их ложить
В Hash Table есть две главные сущности, первая — это собственно сам Hash Table, и вторая — это Bucket (далее ведро, чтобы не заскучали).
В ведрах хранятся сами значения, то есть на каждое значение — свое ведро. Но помимо этого в ведре хранится оригинал ключа, указатели на следующее и предыдущее ведра (они нужны для упорядочивания массива, ведь в PHP ключи могут идти в любом порядке, в каком вы захотите), и, опять же, еще кое-что.
Таким образом, когда вы добавляете новый элемент в массив, если такого ключа там еще нет, то под него создается новое ведро и добавляется в Hash Table.
Но что самое интересное — это как в Hash Table хранятся эти ведра.
Как было сказано выше, у HT есть некий массив указателей на ведра, при этом ведра доступны в этом массиве по некоему индексу, а этот индекс можно вычислить зная ключ ведра. Звучит немного сложно, но на самом деле, все гораздо проще чем кажется. Попробуем разобрать, как происходит получение элемента по ключу из HT:
После этого попробуем добавить в Hash Table, с маской 3, элементы с ключами 54 и 90. А оба этих ключа после наложения маски будут равны двойки.
Что делать с коллизиями?
У ведер оказывается есть еще пара карт в рукаве. Каждое ведро имеет также указатель на предыдущее и следующее ведро, у которых индексы (хеши от ключей) равны.
Таким образом, помимо основного двусвязного списка, который проходит между всеми ведрами, есть еще и мелкие двусвязные списки между теми ведрами, индексы которых равны. То есть получается примерно следующая картина:
Вернемся к нашему кейсу с ключами 54 и 90, и маской 3. После того, как вы добавите 54, структура HT будет выглядеть примерно так:
Теперь добавим элемент с ключом 90, теперь все будет выглядеть примерно так:
Теперь давайте добавим несколько элементов до переполнения nTableSize (напомню, что переполнение будет только тогда, когда nNumOfElements > nTableSize).
Добавим элементы с ключами 0, 1, 3 (такие, которых еще не было, и после наложения масок они останутся теми же), вот что будет:
То, что происходит после переполнения массива, называется rehash. По сути это итерирование по всем существующим ведрам (через pListNext), назначение их соседей (коллизий) и добавление ссылок на них в arBuckets.
Стоит отметить, что в PHP почти все посторено на одной этой структуре HashTable: все переменные, лежащие в каком-либо scope-е, на самом деле лежат в HT, все методы классов, все поля классов, даже сами дефинишины классов лежат в HT, это на самом деле очень гибкая структура. Помимо прочего, HT обеспечивает практически одинаковую скорость выборки/вставки/удаления и сложность всех троих является O(1), но с оговоркой на небольшой оверхед при коллизиях.
Кстати, здесь я реализовал Hash Table в самом PHP. Ну, то есть, имплементировал PHP-шные массивы в PHP =)