Как получить значения массива в PHP: обзор техник
Основные способы получения значений массива
Как получить все значения массива простым и эффективным способом?
Наиболее универсальное решение - использование цикла foreach. Он перебирает все элементы массива без необходимости знать индексы.
$array = ['apple', 'banana', 'cherry'];
foreach ($array as $value) {
echo $value . PHP_EOL;
}
apple banana cherry
Для получения значений вместе с ключами используется foreach ($array as $key => $value). Метод работает с любыми типами массивов (индексными, ассоциативными, смешанными).
Проблема: изменение массива внутри foreach может привести к неожиданным результатам. Решение: использовать ссылку (&$value) или копию массива.
Как получить все значения массива в виде простого списка?
Функция array_values() возвращает все значения исходного массива, переиндексируя их числовыми ключами начиная с 0.
$assoc = ['a' => 10, 'b' => 20, 'c' => 30];
$values = array_values($assoc);
print_r($values);
Array
(
[0] => 10
[1] => 20
[2] => 30
)
Применяется, когда нужно отбросить ключи и работать с последовательными числами.
Ошибка: передача не массива (строка, число) приведёт к предупреждению. Перед вызовом проверяйте тип переменной функцией is_array().
Как получить значения из вложенных массивов по одному столбцу?
array_column() извлекает значение конкретного ключа/индекса из каждого подмассива. Идеально для работы с табличными данными.
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
];
$names = array_column($users, 'name');
print_r($names);
Array
(
[0] => Alice
[1] => Bob
)
Можно также указать третий параметр для ключа результата: array_column($users, 'name', 'id').
Проблема: если ключ отсутствует в некоторых элементах, PHP выдаст предупреждение и вернёт пустую строку. Используйте фильтрацию или проверку isset.
Как преобразовать значения массива с помощью заданной функции?
array_map() применяет колбэк к каждому элементу и возвращает новый массив с изменёнными значениями.
$numbers = [1, 2, 3, 4];
$squared = array_map(function($n) {
return $n * $n;
}, $numbers);
print_r($squared);
Array
(
[0] => 1
[1] => 4
[2] => 9
[3] => 16
)
Если передать несколько массивов, колбэк получит соответствующее количество аргументов.
Ошибка: если колбэк возвращает null, элемент будет сохранён как null. Убедитесь, что функция всегда возвращает значение.
Как получить значения массива, удовлетворяющие условию?
array_filter() фильтрует элементы массива с помощью колбэка. По умолчанию удаляются элементы, равные false.
$nums = [0, 1, 2, 3, 4, 5];
$even = array_filter($nums, function($v) {
return $v % 2 === 0;
});
print_r($even);
Array
(
[1] => 1
[3] => 3
[5] => 5
)
Ключи сохраняются. Для переиндексации используйте array_values() после фильтрации.
Проблема: колбэк не вызывается для элементов, которые были удалены? Нет, колбэк вызывается для каждого элемента. Но если элемент удалён, он не включается в результат.
Как получить значения массива, преобразовав ключи в переменные?
Конструкция list() или короткий синтаксис [] позволяет извлекать элементы по числовым индексам в переменные.
$info = ['John', 25, 'New York'];
list($name, $age, $city) = $info;
echo "$name, $age, $city";
John, 25, New York
Работает только с индексными массивами. Для ассоциативных используйте extract() (с осторожностью).
Проблема: если массив короче, чем количество переменных, или индексы не совпадают, возникает ошибка. Проверяйте длину массива функцией count().
Как получить значения массива с помощью устаревших функций?
each() возвращает текущую пару ключ=>значение и сдвигает указатель. Начиная с PHP 7.2 функция объявлена устаревшей, не рекомендуется к использованию.
$arr = ['a' => 1, 'b' => 2];
while ($pair = each($arr)) {
echo "{$pair['key']} => {$pair['value']}" . PHP_EOL;
}
a => 1 b => 2
Вместо each следует применять foreach.
Ошибка: после PHP 8.0 each удалена полностью. Код упадёт с фатальной ошибкой.
Как получить значения многомерного массива с помощью рекурсии?
Для получения всех значений из многомерного массива (независимо от вложенности) используется рекурсивная функция или array_walk_recursive().
$multi = [
'fruit' => ['apple', 'banana'],
'veggie' => ['carrot', 'potato']
];
$flatten = [];
array_walk_recursive($multi, function($value) use (&$flatten) {
$flatten[] = $value;
});
print_r($flatten);
Array
(
[0] => apple
[1] => banana
[2] => carrot
[3] => potato
)
Функция обходит все уровни, но не сохраняет ключи.
Проблема: array_walk_recursive не передаёт ключи в колбэк (только значения). Для работы с ключами используйте собственную рекурсивную функцию.
Расширенные примеры получения значений массива
1. Получение уникальных значений с помощью array_unique() и переиндексация
$data = [1, 2, 2, 3, 3, 3];
$unique = array_values(array_unique($data));
print_r($unique);
Array
(
[0] => 1
[1] => 2
[2] => 3
)
array_unique сохраняет ключи, поэтому обёртка array_values сбрасывает их.
2. Извлечение значений из вложенных объектов (массив объектов)
$items = [
(object)['id' => 5, 'title' => 'Book'],
(object)['id' => 8, 'title' => 'Pen']
];
$titles = array_map(function($obj) { return $obj->title; }, $items);
print_r($titles);
Array
(
[0] => Book
[1] => Pen
)
Для объектов array_column не работает (требует массив), поэтому используется array_map.
3. Получение значений массива по нескольким ключам с помощью array_intersect_key
$full = ['name' => 'Alice', 'age' => 30, 'city' => 'Paris'];
$keys = ['name', 'city'];
$subset = array_intersect_key($full, array_flip($keys));
print_r($subset);
Array
(
[name] => Alice
[city] => Paris
)
array_flip создаёт массив искомых ключей в качестве ключей, затем array_intersect_key оставляет только совпадающие.
4. Рекурсивное получение всех значений с сохранением пути (ключей)
function flattenWithKeys($array, $prefix = '') {
$result = [];
foreach ($array as $key => $value) {
$newKey = $prefix ? $prefix . '.' . $key : $key;
if (is_array($value)) {
$result = array_merge($result, flattenWithKeys($value, $newKey));
} else {
$result[$newKey] = $value;
}
}
return $result;
}
$arr = ['a' => ['b' => 1, 'c' => 2], 'd' => 3];
$flat = flattenWithKeys($arr);
print_r($flat);
Array
(
[a.b] => 1
[a.c] => 2
[d] => 3
)
Полезно для конфигураций или преобразования в плоскую структуру.
5. Получение случайного значения из массива
$fruits = ['apple', 'banana', 'cherry', 'date'];
$random = $fruits[array_rand($fruits)];
echo $random;
banana (или другой случайный элемент)
array_rand возвращает случайный ключ. Для получения нескольких значений передаётся второй параметр.
6. Использование array_slice для получения части массива (слайс значений)
$nums = [10, 20, 30, 40, 50];
$slice = array_slice($nums, 1, 3); // начиная с индекса 1, 3 элемента
print_r($slice);
Array
(
[0] => 20
[1] => 30
[2] => 40
)
По умолчанию array_slice сбрасывает ключи. Чтобы сохранить, передайте четвёртый параметр true.
7. Получение первых N элементов с помощью array_slice + reset
$data = ['x', 'y', 'z', 'w'];
$firstTwo = array_slice($data, 0, 2);
print_r($firstTwo);
Array
(
[0] => x
[1] => y
)
Аналог - array_splice, но он модифицирует исходный массив.
8. Комбинирование array_map и array_filter для сложных преобразований
$words = [' hello ', 'world', '', ' PHP '];
$trimmed = array_map('trim', $words);
$nonEmpty = array_filter($trimmed, function($v) { return $v !== ''; });
print_r(array_values($nonEmpty));
Array
(
[0] => hello
[1] => world
[2] => PHP
)
Последовательно применяются разные функции для очистки и фильтрации.
9. Получение значений ассоциативного массива как списка с помощью array_keys и array_values
$colors = ['red' => '#FF0000', 'green' => '#00FF00', 'blue' => '#0000FF'];
$colorNames = array_keys($colors);
$colorCodes = array_values($colors);
print_r($colorNames);
print_r($colorCodes);
Array
(
[0] => red
[1] => green
[2] => blue
)
Array
(
[0] => #FF0000
[1] => #00FF00
[2] => #0000FF
)
Полезно для создания выпадающих списков из ассоциативного массива.
10. Получение значений с помощью итератора (для больших массивов)
$large = range(1, 1000000);
$iterator = new ArrayIterator($large);
$count = 0;
foreach ($iterator as $value) {
if ($value % 100000 === 0) {
echo $value . PHP_EOL;
}
// обработка без загрузки всего в память (если массив уже в памяти)
}
100000 200000 ...
ArrayIterator позволяет использовать foreach для массивов с дополнительной функциональностью (поиск, сортировка).