Нарезка многомерного массива PHP по одному из его элементов

Скажем, например, вы только что запросили базу данных и получили этот 2D-массив.

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);

Я часто замечаю, что пишу такие петли.

foreach($results as $result)
    $names[] = $result['name'];

Мои вопросы: существует ли способ получить этот массив $ names без использования цикла? Использование функций обратного вызова считается использованием цикла.

Вот более общий пример получения каждого поля.

foreach($results as $result)
    foreach($result as $key => $value)
        $fields[$key][] = $value;

FWIW, я дал ответ на аналогичный вопрос здесь: stackoverflow.com/a/10660002/128346.

Wil Moore III 21.03.2013 10:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
21
1
23 689
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Проще говоря, нет.

Вам нужно будет использовать цикл или функцию обратного вызова, например array_walk.

Это уже не так. PHP 5.5 предлагает встроенную функцию array_column :)

Amal Murali 08.02.2014 16:32

Я проголосовал за ответ @ Devon, потому что на самом деле нет способа сделать то, что вы просите, с помощью встроенной функции. Лучшее, что вы можете сделать, это написать свое собственное:

function array_column($array, $column)
{
    $ret = array();
    foreach ($array as $row) $ret[] = $row[$column];
    return $ret;
}

Ошибка в том, что вы не объявили ret, даже если вам это технически не нужно в PHP. ($ret = array();)

mpen 05.10.2011 00:45

@Quentin, пожалуйста, проинформируйте отвечающего пользователя обо всем, что вы считаете неправильным в ответе, вместо того, чтобы тихонько его исправлять.

Timothy Groote 18.06.2013 15:48

Это был комментарий Марка об инициализации $ret. Я поддержал комментарий Марка, предложил изменить ответ с приложенным объяснением. Я должен был добавить сюда комментарий?

Quentin 20.06.2013 12:18

Иронично, что в PHP была включена основная функция с точно такой же меткой array_column() .. !! Вы были вовлечены?

Fr0zenFyr 11.05.2015 01:52

@ Fr0zenFyr ха-ха, нет. Просто совпадение :)

inxilpro 11.05.2015 17:13

Я думаю, это сделает то, что ты хочешь

array_uintersect_uassoc

Вам нужно будет сделать что-то вроде этого

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
$name = array_uintersect_uassoc( $results, array('name' => 'value')  , 0, "cmpKey");
print_r($name);

//////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////
function cmpKey($key1, $key2) {
  if ($key1 == $key2) {
    return 0;
  } else {
    return -1;
  }
}

Однако у меня нет доступа к PHP5, поэтому я не тестировал это.

У меня это не сработало в PHP5. Я получил предупреждение о недопустимом обратном вызове и пустой массив.

Devon 03.10.2008 00:29

Это не удается, потому что вы должны передать функцию, а не 0. Даже если я передаю функцию, которая всегда возвращает true или false, я все равно не получу правильного ответа. Вы не можете использовать пересечение массива, потому что это массив внутри массива. Вы можете использовать array_walk или array_map в зависимости от типа возвращаемого значения.

gradbot 06.10.2008 23:57

Я провел больше исследований по этому поводу и обнаружил, что и у рубина, и у прототипа есть функция, которая выполняет это, под названием array_pluck, 2. Интересно, что array_map имеет второе применение, которое позволяет вам делать обратное тому, что я хочу здесь делать. Я также нашел PHP класс, который кто-то пишет, чтобы имитировать манипуляции с массивами прототипами.

Я собираюсь еще немного покопаться, и если я не найду ничего другого, я поработаю над патчем, чтобы отправить его в список рассылки [email protected] и посмотреть, добавят ли они array_pluck.

Начиная с PHP 5.3, вы можете использовать этот красивый вызов с лямбда-функцией:

$names = array_map(function ($v){ return $v['name']; }, $results);

Это вернет массив, нарезанный по измерению «имя».

Вы можете дополнительно использовать array_unique для возвращаемого срезанного измерения, чтобы получить уникальные имена.

Alexey Petushkov 26.11.2012 13:06
Ответ принят как подходящий

С 20 июня в PHP-5.5 появилась новая функция array_column

Например:

$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe'
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith'
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones'
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe'
    )
);


$firstNames = array_column($records, 'first_name');
print_r($firstNames);

Вернется

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

По указанной выше ссылке есть еще больше примеров.

Ух ты! Рад найти эту функцию. Довольно удобно и просто по сравнению с array_map(). Однако нужно сравнить производительность.

Fr0zenFyr 11.05.2015 01:53

Вы могли сделать:

$tmp = array_flip($names);
$names = array_keys($tmp);

Для тех из вас, кто не может выполнить обновление до PHP5.5 прямо сейчас и нуждается в этой функции, вот реализация array_column.

function array_column($array, $column){
    $a2 = array();
    array_map(function ($a1) use ($column, &$a2){
        array_push($a2, $a1[$column]);
    }, $array);
    return $a2;
}

Если вы используете версию PHP до 5.5 и array_column(), вы можете использовать официальную замену на обычном PHP:

https://github.com/ramsey/array_column

Это быстрая альтернатива функции array_column ()

if (!function_exists('array_column')) {
    function array_column($element_name) {
        $ele =   array_map(function($element) {
            return $element[$element_name];
        }, $a);
        return  $ele;
    }
}

Другие вопросы по теме