- Массивы php несколько значений
- Массивы в PHP
- Создание массива
- Ключи и значения массива
- Простые и ассоциативные массивы
- Вывод массива
- Добавление и удаление элементов
- Двумерные и многомерные массивы
- Задача 1
- Задача 2
- Дополнения к функции in_array()
- Проверка сразу нескольких значений в массиве
- Пример использования:
- Одно из нескольких значений в массиве
- Пример использования:
- in_array для многомерного массива
- Пример использования:
- Комментарии
- Другие публикации
Массивы php несколько значений
// Before php 5.4
$array = array(1,2,3);
// since php 5.4 , short syntax
$array = [1,2,3];
// I recommend using the short syntax if you have php version >= 5.4
Used to creating arrays like this in Perl?
Looks like we need the range() function in PHP:
$array = array_merge (array( ‘All’ ), range ( ‘A’ , ‘Z’ ));
?>
You don’t need to array_merge if it’s just one range:
There is another kind of array (php>= 5.3.0) produced by
$array = new SplFixedArray(5);
Standard arrays, as documented here, are marvellously flexible and, due to the underlying hashtable, extremely fast for certain kinds of lookup operation.
Supposing a large string-keyed array
$arr=[‘string1’=>$data1, ‘string2’=>$data2 etc. ]
when getting the keyed data with
php does *not* have to search through the array comparing each key string to the given key (‘string1’) one by one, which could take a long time with a large array. Instead the hashtable means that php takes the given key string and computes from it the memory location of the keyed data, and then instantly retrieves the data. Marvellous! And so quick. And no need to know anything about hashtables as it’s all hidden away.
However, there is a lot of overhead in that. It uses lots of memory, as hashtables tend to (also nearly doubling on a 64bit server), and should be significantly slower for integer keyed arrays than old-fashioned (non-hashtable) integer-keyed arrays. For that see more on SplFixedArray :
Unlike a standard php (hashtabled) array, if you lookup by integer then the integer itself denotes the memory location of the data, no hashtable computation on the integer key needed. This is much quicker. It’s also quicker to build the array compared to the complex operations needed for hashtables. And it uses a lot less memory as there is no hashtable data structure. This is really an optimisation decision, but in some cases of large integer keyed arrays it may significantly reduce server memory and increase performance (including the avoiding of expensive memory deallocation of hashtable arrays at the exiting of the script).
When creating arrays , if we have an element with the same value as another element from the same array, we would expect PHP instead of creating new zval container to increase the refcount and point the duplicate symbol to the same zval. This is true except for value type integer.
Example:
$arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => 23 ];
xdebug_debug_zval( ‘arr’ );
(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=0, is_ref=0)int 23
‘too’ => (refcount=0, is_ref=0)int 23
but :
$arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => ’23’ ];
xdebug_debug_zval( ‘arr’ );
(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=0, is_ref=0)int 23
‘too’ => (refcount=1, is_ref=0)string ’23’ (length=2)
or :
$arr = [‘bebe’ => ‘Bob’, ‘age’ => [1,2], ‘too’ => [1,2] ];
xdebug_debug_zval( ‘arr’ );
(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=2, is_ref=0)
array (size=2)
0 => (refcount=0, is_ref=0)int 1
1 => (refcount=0, is_ref=0)int 2
‘too’ => (refcount=2, is_ref=0)
array (size=2)
0 => (refcount=0, is_ref=0)int 1
1 => (refcount=0, is_ref=0)int 2
This function makes (assoc.) array creation much easier:
function arr (. $array )< return $array ; >
?>
It allows for short syntax like:
$arr = arr ( x : 1 , y : 2 , z : 3 );
?>
Instead of:
$arr = [ «x» => 1 , «y» => 2 , «z» => 3 ];
// or
$arr2 = array( «x» => 1 , «y» => 2 , «z» => 3 );
?>
Sadly PHP 8.2 doesn’t support this named arguments in the «array» function/language construct.
Массивы в PHP
Массив — это переменная, которая может содержать в себе сразу несколько значений.
Например, так можно объявить массив с тремя значениями:
В коде выше мы создаём переменную $heroes и добавляем в неё 3 строки.
Массивы также отлично подходят для объединения нескольких связанных между собой значений, например характеристик товара:
'ABC123', 'name' => 'Смартфон iPhone X 64Gb White', 'price' => 50000, ];
Создание массива
Для создания пустого массива просто укажите квадратные скобки вместо значения:
PHP сообщает нам, что в переменной лежит массив (англ. array), в котором находится 0 значений.
Чтобы объявить массив с данными, просто перечислите значения в квадратных скобках:
Теперь в переменной $brands лежит массив, состоящий из трёх элементов.
Создание массивов с помощью квадратных скобок работает начиная с версии PHP 5.4. До этого использовался более громоздкий синтаксис:
Ключи и значения массива
Массив состоит из ключей (индексов) и соответствующих им значений. Это можно представить как таблицу:
Ключ | Значение |
---|---|
0 | Samsung |
1 | Apple |
2 | Nokia |
У каждого значения есть свой ключ. В массиве не может быть несколько одинаковых ключей.
Вернёмся к предыдущему примеру и посмотрим, что лежит в массиве:
array(3) < [0]=>string(7) "samsung" [1]=> string(5) "apple" [2]=> string(5) "nokia" >
Когда мы создаём массив без указания ключей, PHP генерирует их автоматически в виде чисел, начиная с 0.
Указание ключей происходит с помощью конструкции => :
'iPhone', 'price' => 5000]; // Большие массивы удобней писать так: $product2 = [ 'name' => 'Samsung', 'price' => 5000, 'status' => true, 'shipping' => 200 ];
Простые и ассоциативные массивы
Когда мы создаём массив с числовыми ключами, такой массив называется простым или числовым.
Когда мы создаём массив и указываем строковые ключи вручную, такой массив называется ассоциативным, поскольку по названию ключа можно понять назначение этого значения — название товара, возраст человека и т.д.
Вывод массива
Вывод элементов массива выглядит следующим образом:
Для вывода содержимого массива можно использовать как уже знакомую нам функцию var_dump() , так и print_r() , которая предоставляет информацию о массивах в чуть более удобном для чтения виде.
Однако обе функции выводят информацию на одной строке, что в случае с массивами превращается в кашу. Чтобы этого не происходило, используйте тег :
'; print_r(['val1', 'val2', 'val3']); echo '
';
Array ( [0] => val1 [1] => val2 [2] => val3 )
Также вывести содержимое массива можно с помощью цикла foreach:
Подробней работу цикла foreach мы разберём в отдельном уроке.
Добавление и удаление элементов
Добавление новых элементов в массив выглядит следующим образом:
'Вася']; // Добавляем элементы $arr['age'] = 20; $arr['status'] = 'В смятении'; // Перезаписываем элемент $arr['status'] = 'Спокоен';
Но если название ключа не играет роли, его можно опустить:
Удалить элемент массива можно с помощью функции unset() :
Двумерные и многомерные массивы
В качестве значения массива мы можем передать ещё один массив:
'Вася']; // Добавляем новый элемент, содержащий массив $human['hands'] = ['left', 'right']; print_r($human);
В примере выше мы создали массив $human , а затем внутри него создали ещё один массив $human[‘hands’] . Результат в браузере:
Array ( [name] => Вася [hands] => Array ( [0] => left [1] => right ) )
Обратиться к элементу многомерного массива можно так:
Теперь мы можем хранить в одном массиве целую базу товаров:
'iPhone', 'price' => 5000, 'status' => true ], [ 'name' => 'Samsung Galaxy', 'price' => 5000, 'status' => true ] ];
Или альтернативный вариант:
'iPhone', 'price' => 5000, 'status' => true ]; $products[] = [ 'name' => 'Samsung Galaxy', 'price' => 5000, 'status' => true ];
Задача 1
1. Создайте массивы $user1 и $user2 , заполните ключи name и age в каждом массиве любыми значениями.
2. Увеличьте значение age у обоих массивов на 50%.
3. Выведите на экран значение ключа name обоих пользователей.
'Петросян', 'age' => 50 ]; $user2 = [ 'name' => 'Мартиросян', 'age' => 40 ]; $user1['age'] *= 1.5; $user2['age'] *= 1.5; echo $user1['name'], ' ', $user2['name'];
Задача 2
1. Создайте массив $city , добавьте в него ключ name с любым значением.
2. Создайте подмассив streets с любыми случайными улицами. Каждая улица должна иметь имя (name) и количество домов (buildings_count), а также подмассив из номеров домов (old_buildings), подлежащих сносу.
'Ростов', 'streets' => [ [ 'name' => 'Первая улица', 'buildings_count' => 15, 'old_buildings' => [4, 8, 12] ], [ 'name' => 'Вторая улица', 'buildings_count' => 5, 'old_buildings' => [1, 3] ], [ 'name' => 'Третья улица', 'buildings_count' => 23, 'old_buildings' => [2, 7, 12, 18] ], ] ]; // Жесть, да? echo $city['streets'][2]['old_buildings'][1]; // 7
Дополнения к функции in_array()
PHP-функция in_array() проверяет, присутствует ли в массиве значение:
$array = array("Mac", "NT", "Irix", "Linux"); if (in_array('Irix', $array))
Но в некоторых моментах её будет не достаточно, далее подробнее:
Проверка сразу нескольких значений в массиве
Если требуется проверить наличие сразу нескольких значений в массиве – функция in_array_all() .
function in_array_all($needles, $haystack)
Пример использования:
$array = array('Mac', 'NT', 'Irix', 'Linux'); if (in_array_all(array('Mac', 'Win'), $array)) < echo 'true'; >else < echo 'false'; // Выведется false т.к. в $array нет 'Win' >
Одно из нескольких значений в массиве
Если требуется проверить вхождение хотя бы одного из нескольких значений, подойдет функция in_array_any() .
function in_array_any($needles, $haystack)
Пример использования:
$array = array('Mac', 'NT', 'Irix', 'Linux'); if (in_array_any(array('Mac', 'Win'), $array)) < echo 'true'; // Выведется true т.к. в $array есть 'Mac' >else
in_array для многомерного массива
Для поиска значения в многомерном массиве поможет функция in_array_r() :
function in_array_r($needle, $haystack, $strict = false) < foreach ($haystack as $item) < if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) < return true; >> return false; >
Пример использования:
$array = array( 0 => array('Mac'), 1 => array('NT'), 2 => array('Irix'), 3 => array('Linux') ); if (in_array_r('Mac', $array)) < echo 'true'; // Выведется true >else
Комментарии
Другие публикации
В продолжении темы работы с массивами поговорим о типичной задаче – их сортировке. Для ее выполнения в PHP существует множество функций, их подробное описание можно посмотреть на php.net, рассмотрим.
Две мини функции которые облегчают выделения полей select, radio и checkbox до и после отправки форм.
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет.