Работаем с массивами в PHP7
Массив представляет собой составной тип данных, который представляет собой связь между ключами и значениями. В PHP это один из самых популярных и мощных типов данных. Существует около 80 функций для работы с массивами. Эта особенность страдает от той же причудливости, приписываемой языку в целом.
- несовместимое соглашение об именах - asort - это не тот же шаблон, что и array_walk. Более интуитивное имя - array_sort.
- непоследовательный порядок аргументов - array_filter($array, $callback) и array_map($callback, $array). strpos($haystack, $needle) и array_search($needle, $haytsack).
Тем не менее, массивы никуда не денутся, и их сила не уменьшается. В последних версиях языка были усовершенствованы функции. Давайте кратко рассмотрим две из них.
Константы в PHP
Начиная с PHP 5.3 существует два способа определения констант:
- с помощью ключевого слова: const
- и с использование функции: define().
Например, const TOTAL_ITEMS = 5; и define('FUNNY_MAN', 'Mr Bean');
Основное отличие заключается в том, что const принимает только статическое скалярное значение (число или строку, а также другие константы, такие как TRUE, FALSE, NULL, __FILE__ и т.д.), в то время как в define вы можете передать любое выражение, например. define('DURATION', 24 * 60 * 60);
Затем в PHP 5.6 добавили возможность для const также принимать выражения: const DURATION = 24 * 60 * 60;. Однако в PHP7 возможности const расширили:
define('PREMIER_LEAGUE_TEAMS', [
'Arsenal',
'Chelsea',
'Liverpool',
'Manchester City',
'Manchester United',
'Tottenham Hotspur',
]);
const PREMIER_LEAGUE_TEAMS = [
'Arsenal',
'Chelsea',
'Liverpool',
'Manchester City',
'Manchester United',
'Tottenham Hotspur',
];
Функции в PHP7 для работы с массивами
Функция array_column, введенная в PHP 5.5, является еще одним примером прогрессивного улучшения функций в PHP 7. Например, учитывая приведенный ниже массив:
$students = [
[
'student_id' => 'DEN20170017',
'firstname' => 'Ngozi',
'lastname' => 'Chukwuemeka',
'score' => 78,
],
[
'student_id' => 'DEN20170112',
'firstname' => 'David',
'lastname' => 'Babajide',
'score' => 82,
],
[
'student_id' => 'DEN20170002',
'firstname' => 'Usman',
'lastname' => 'Lawal',
'score' => 76,
],
[
'student_id' => 'DEN20170088',
'firstname' => 'Ade',
'lastname' => 'Ogunbameru',
'score' => 49,
],
];
До версии PHP 5.5, чтобы получить массив всех столбцов, нужно сделать что-то вроде:
$scores = [];
foreach ($students as $student) {
$scores[] = $student['score'];
}
В PHP 5.5:
$scores = array_column($students, 'score'); // [0 => 78, 1 => 82, 2 => 76, 3 => 49]
И для индексации столбца другим столбцом, например:
$scores = [];
foreach ($students as $student) {
$scores[$student['student_id']] = $student['score'];
}
Новая функция также делает это:
$scores = array_column($students, 'score', 'student_id'); // ['DEN20170017' => 78, 'DEN20170112' => 82, 'DEN20170002' => 76, 'DEN20170088' => 49]
Все лучше и лучше. А что относительно PHP7? Теперь array_column принимает массив объектов, из которых вытягивается массив общедоступных свойств:
$student1 = new stdClass(); $student1->student_id = 'DEN20170017'; $student1->firstname = 'Ngozi'; $student1->lastname = 'Chukwuemeka'; $student1->score = 78; $student2 = new stdClass(); $student2->student_id = 'DEN20170112'; $student2->firstname = 'David'; $student2->lastname = 'Babajide'; $student2->score = 82; $student3 = new stdClass(); $student3->student_id = 'DEN20170002'; $student3->firstname = 'Usman'; $student3->lastname = 'Lawal'; $student3->score = 76; $student4 = new stdClass(); $student4->student_id = 'DEN20170088'; $student4->firstname = 'Ade'; $student4->lastname = 'Ogunbameru'; $student4->score = 49; $students = [$student1, $student2, $student3, $student4];
Мы получаем те же результаты, что и раньше, с
$scores = array_column($students, 'score');
И
$scores = array_column($students, 'score', 'student_id');
Обратите внимание, что array_column не работает рекурсивно, т. е. он не работает с вложенными массивами.