В этом уроке я собираюсь составить список общих функций массива PHP с примерами использования и лучшими практиками. Каждый разработчик PHP должен знать, как их использовать и как комбинировать функции массива, чтобы сделать код читаемым и коротким.
Кроме того, есть презентация с приведенными примерами кода, так что вы можете скачать ее по соответствующим ссылкам и показать ее своим коллегам для создания более сильной команды.
Основы
Давайте начнем с основных функций, которые работают с ключами и значениями массива. Одним из них является array_combine () , который создает массив, используя один массив для ключей и другой для его значений:
01
02
03
04
05
06
07
08
09
10
11
12
|
$keys = [‘sky’, ‘grass’, ‘orange’];
$values = [‘blue’, ‘green’, ‘orange’];
$array = array_combine($keys, $values);
print_r($array);
// Array
// (
// [sky] => blue
// [grass] => green
// [orange] => orange
// )
|
Вы должны знать, что функция array_values () возвращает индексированный массив значений, array_keys () возвращает массив ключей данного массива, а array_flip () обменивает ключи значениями:
01
02
03
04
05
06
07
08
09
10
|
print_r(array_keys($array));
print_r(array_values($array));
print_r(array_flip($array));
// Array
// (
// [blue] => sky
// [green] => grass
// [orange] => orange
// )
|
Сделайте ваш код короче
Функция list () , которая на самом деле не является функцией, а является языковой конструкцией, предназначена для короткого назначения переменных. Например, вот базовый пример использования функции list()
:
01
02
03
04
05
06
07
08
09
10
|
// define array
$array = [‘a’, ‘b’, ‘c’];
// without list()
$a = $array[0];
$b = $array[1];
$c = $array[2];
// with list()
list($a, $b, $c) = $array;
|
Эта конструкция прекрасно работает с такими функциями, как preg_slit()
или preg_slit()
explode()
. Кроме того, вы можете пропустить некоторые параметры, если вам не нужно их определять:
1
2
3
|
$string = ‘hello|wild|world’;
list($hello, , $world) = explode(‘|’, $string);
echo(«$hello, $world»);
|
Кроме того, list()
может использоваться с foreach
, что делает эту конструкцию еще лучше:
1
2
3
4
5
6
|
$arrays = [[1, 2], [3, 4], [5, 6]];
foreach ($arrays as list($a, $b)) {
$c = $a + $b;
echo($c . ‘, ‘);
}
|
С помощью функции extract () вы можете экспортировать ассоциативный массив в переменные. Для каждого элемента массива будет создана переменная с именем ключа и значением в качестве значения элемента:
1
2
3
4
5
6
7
8
9
|
$array = [
‘clothes’ => ‘t-shirt’,
‘size’ => ‘medium’,
‘color’ => ‘blue’,
];
extract($array);
echo(«$clothes $size $color»);
|
Имейте в виду, что extract()
небезопасен, если вы работаете с пользовательскими данными (например, результатами запросов), поэтому лучше использовать эту функцию с флагами EXTR_IF_EXISTS
и EXTR_PREFIX_ALL
.
Противоположностью предыдущей функции является функция compact () , которая создает ассоциативный массив из переменных:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$clothes = ‘t-shirt’;
$size = ‘medium’;
$color = ‘blue’;
$array = compact(‘clothes’, ‘size’, ‘color’);
print_r($array);
// Array
// (
// [clothes] => t-shirt
// [size] => medium
// [color] => blue
// )
|
Функции фильтрации
Существует отличная функция для фильтрации массивов, и она называется array_filter () . Передайте массив в качестве первого параметра и анонимную функцию в качестве второго параметра. Верните true
в функцию обратного вызова, если вы хотите оставить этот элемент в массиве, и false
если вы этого не сделаете:
1
2
3
4
5
6
7
|
$numbers = [20, -3, 50, -99, 55];
$positive = array_filter($numbers, function($number) {
return $number > 0;
});
print_r($positive);
|
Существует способ фильтрации не только по значениям. Вы можете использовать ARRAY_FILTER_USE_KEY
или ARRAY_FILTER_USE_BOTH
в качестве третьего параметра для передачи ключа или значения и ключа в функцию обратного вызова.
Также вы можете вызвать array_filter()
без обратного вызова, чтобы удалить все пустые значения:
1
2
3
4
5
|
$numbers = [-1, 0, 1];
$not_empty = array_filter($numbers);
print_r($not_empty);
|
Вы можете получить только уникальные значения из массива, используя функцию array_unique () . Обратите внимание, что функция сохранит ключи первых уникальных элементов:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$array = [1, 1, 1, 1, 2, 2, 2, 3, 4, 5, 5];
$uniques = array_unique($array);
print_r($uniques);
// Array
// (
// [0] => 1
// [4] => 2
// [7] => 3
// [8] => 4
// [9] => 5
// )
|
С помощью array_column () вы можете получить список значений столбцов из многомерного массива, например, ответ из базы данных SQL или импорт из файла CSV. Просто передайте имя массива и столбца:
1
2
3
4
5
6
7
8
9
|
$array = [
[‘id’ => 1, ‘title’ => ‘tree’],
[‘id’ => 2, ‘title’ => ‘sun’],
[‘id’ => 3, ‘title’ => ‘cloud’],
];
$ids = array_column($array, ‘id’);
print_r($ids);
|
Начиная с PHP 7, array_column()
становится еще более мощным, поскольку теперь ему разрешено работать с массивом объектов . Так что работать с массивом моделей стало проще:
1
2
|
$cinemas = Cinema::find()->all();
$cinema_ids = array_column($cinemas, ‘id’);
|
Прогулка по массивам
Используя array_map () , вы можете применить обратный вызов к каждому элементу массива. Вы можете передать имя функции или анонимную функцию, чтобы получить новый массив на основе данного массива:
01
02
03
04
05
06
07
08
09
10
11
|
$cities = [‘Berlin’, ‘KYIV’, ‘Amsterdam’, ‘Riga’];
$aliases = array_map(‘strtolower’, $cities);
print_r($aliases);
$numbers = [1, -2, 3, -4, 5];
$squares = array_map(function($number) {
return $number ** 2;
}, $numbers);
print_r($squares);
|
Существует миф о том, что нет способа передать значения и ключи массива в функцию обратного вызова, но мы можем разрушить это:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
$model = [‘id’ => 7, ‘name’=>’James’];
$callback = function($key, $value) {
return «$key is $value»;
};
$res = array_map($callback, array_keys($model), $model);
print_r($res);
// Array
// (
// [0] => id is 7
// [1] => name is James
// )
|
Но это выглядит грязно. Вместо этого лучше использовать array_walk () . Эта функция выглядит так же, как array_map()
, но работает по-другому. Прежде всего, массив передается по ссылке, поэтому array_walk()
не создает новый массив, а изменяет данный массив. Таким образом, в качестве исходного массива вы можете передать значение массива по ссылке в обратном вызове. Ключи массива также можно легко передать:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
$fruits = [
‘banana’ => ‘yellow’,
‘apple’ => ‘green’,
‘orange’ => ‘orange’,
];
array_walk($fruits, function(&$value, $key) {
$value = «$key is $value»;
});
print_r($fruits);
// Array
// (
// [banana] => banana is yellow
// [apple] => apple is green
// [orange] => orange is orange
// )
|
Присоединение к массивам
Лучший способ объединить два или более массивов в PHP — это использовать функцию array_merge () . Элементы массивов будут объединены вместе, а значения с одинаковыми строковыми ключами будут перезаписаны последним значением:
01
02
03
04
05
06
07
08
09
10
11
12
|
$array1 = [‘a’ => ‘a’, ‘b’ => ‘b’, ‘c’ => ‘c’];
$array2 = [‘a’ => ‘A’, ‘b’ => ‘B’, ‘D’ => ‘D’];
$merge = array_merge($array1, $array2);
print_r($merge);
// Array
// (
// [a] => A
// [b] => B
// [c] => c
// [D] => D
// )
|
Чтобы удалить значения массива из другого массива (или массивов), используйте array_diff () . Чтобы получить значения, которые присутствуют в данных массивах, используйте array_intersect () . Следующие примеры покажут, как это работает:
1
2
3
4
5
6
7
8
|
$array1 = [1, 2, 3, 4];
$array2 = [3, 4, 5, 6];
$diff = array_diff($array1, $array2);
print_r($diff);
$intersect = array_intersect($array1, $array2);
print_r($intersect);
|
Делайте математику с массивом значений
Используйте array_sum (), чтобы получить сумму значений массива, array_product (), чтобы умножить их, или создайте собственную формулу с помощью array_reduce () :
1
2
3
4
5
6
7
8
|
$numbers = [1, 2, 3, 4, 5];
echo(array_sum($numbers));
echo(array_product($numbers));
echo(array_reduce($numbers, function($carry, $item) {
return $carry ?
}));
|
Чтобы подсчитать все значения массива, используйте array_count_values () . Это даст все уникальные значения данного массива в качестве ключей и количество этих значений в качестве значения:
01
02
03
04
05
06
07
08
09
10
11
|
$things = [‘apple’, ‘apple’, ‘banana’, ‘tree’, ‘tree’, ‘tree’];
$values = array_count_values($things);
print_r($values);
// Array
// (
// [apple] => 2
// [banana] => 1
// [tree] => 3
// )
|
Генерация массивов
Чтобы создать массив с заданным размером и тем же значением, используйте array_fill () :
1
2
|
$bind = array_fill(0, 5, ‘?’);
print_r($bind);
|
Для создания массива с диапазоном ключей и значений, таких как дневные часы или буквы, используйте range () :
1
2
3
4
5
|
$letters = range(‘a’, ‘z’);
print_r($letters);
$hours = range(0, 23);
print_r($hours);
|
Чтобы получить часть массива — например, только первые три элемента — используйте array_slice () :
1
2
3
|
$numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$top = array_slice($numbers, 0, 3);
print_r($top);
|
Сортировка массивов
Хорошо помнить, что каждая функция сортировки в PHP работает с массивами по ссылке и возвращает true в случае успеха или false в случае ошибки. Существует базовая функция сортировки, которая называется sort () , и она сортирует значения в порядке возрастания без сохранения ключей. Функция сортировки может быть дополнена следующими буквами:
- сортировать сохраняющие ключи
- k , сортировка по ключам
- r , сортировка в обратном / нисходящем порядке
- сортировать с помощью пользовательской функции
Вы можете увидеть комбинации этих букв в следующей таблице:
К | р | U | ||
asort | arsort | uasort | ||
К | ksort | krsort | ||
р | arsort | krsort | rsort | |
U | uasort | usort |
Объединение функций массива как босс
Настоящая магия начинается, когда вы начинаете комбинировать функции массива. Вот как вы можете обрезать и удалить пустые значения в одной строке кода с помощью array_filter()
и array_map()
:
1
2
3
4
|
$values = [‘say ‘, ‘ bye’, ‘ ‘, ‘ to’, ‘ spaces ‘, ‘ ‘];
$words = array_filter(array_map(‘trim’, $values));
print_r($words);
|
Чтобы создать идентификатор для карты заголовков из массива моделей, мы можем использовать комбинацию array_combine()
и array_column()
:
1
2
3
4
5
6
|
$models = [$model1, $model2, $model3];
$id_to_title = array_combine(
array_column($models, ‘id’),
array_column($models, ‘title’)
);
|
Чтобы получить три верхних значения массива, мы можем использовать array_count_values()
, arsort()
и array_slice()
:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
$letters = [‘a’, ‘a’, ‘a’, ‘a’, ‘b’, ‘b’, ‘c’, ‘d’, ‘d’, ‘d’, ‘d’, ‘d’];
$values = array_count_values($letters);
arsort($values);
$top = array_slice($values, 0, 3);
print_r($top);
// Array
// (
// [d] => 5
// [a] => 4
// [b] => 2
// )
|
С помощью array_sum()
и array_map()
вычислить сумму порядка в несколько строк:
01
02
03
04
05
06
07
08
09
10
11
|
$order = [
[‘product_id’ => 1, ‘price’ => 99, ‘count’ => 1],
[‘product_id’ => 2, ‘price’ => 50, ‘count’ => 2],
[‘product_id’ => 2, ‘price’ => 17, ‘count’ => 3],
];
$sum = array_sum(array_map(function($product_row) {
return $product_row[‘price’] * $product_row[‘count’];
}, $order));
print_r($sum);
|
Вывод
Как видите, знание основных функций массива может сделать ваш код намного короче и более читабельным. Конечно, в PHP гораздо больше функций массива, и даже у данных функций есть много вариантов использования с дополнительными параметрами и флагами, но я думаю, что в этом уроке мы рассмотрели основы, которые должен знать каждый разработчик PHP.
Обратите внимание, что я создал презентацию с приведенными примерами, поэтому вы можете скачать ее по соответствующим ссылкам и показать своей команде.
Если у вас есть какие-либо вопросы, не стесняйтесь задавать их в комментариях к статье.