Как получить значения массива в 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 для массивов с дополнительной функциональностью (поиск, сортировка).

Получение значений массива в PHP - comments

En
Php получить значения массива (php)