Статьи

Правильная работа с массивами PHP

В этом уроке я собираюсь составить список общих функций массива 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.

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

Если у вас есть какие-либо вопросы, не стесняйтесь задавать их в комментариях к статье.