Як отримати масив конкретного "ключа" у багатовимірному масиві без циклу


115

Припустимо, у мене є такий багатовимірний масив (отриманий з MySQL або служби):

array(
    array(
        [id] => xxx,
        [name] => blah
    ),
    array(
        [id] => yyy,
        [name] => blahblah
    ),
    array(
        [id] => zzz,
        [name] => blahblahblah
    ),
)

Чи можемо ми отримати масив ids в одному « вбудованому » функції виклику php? або один рядок коду?
Я знаю про традиційне циклічне отримання та отримання цінності, але мені це не потрібно:

foreach($users as $user) {
    $ids[] = $user['id'];
}
print_r($ids);

Можливо, хтось array_map()і call_user_func_array()може зробити чари.


"Чи можемо ми отримати масив ідентифікаторів за один виклик функції?" так, але вам доведеться написати функцію
:)

@ BorisGuéry, я мав на увазі вбудований функції :-)
ifaour

2
PS: Я знаю, що можу писати foreach($users as $user) {$ids[] = $user['id'];}одним рядком! але ви знаєте, що я маю на увазі / потребую :-)
ifaour

@Eugene, мені потрібен масив для інших речей, очевидно. І знову це лише для розваги та вивчення нових скорочень у PHP.
ifaour

Відповіді:


261

Оскільки php 5.5, ви можете використовувати array_column:

$ids = array_column($users, 'id');

Це кращий варіант для будь-якого сучасного проекту. Однак якщо вам потрібно підтримувати php> 5.5, існують такі варіанти:

Оскільки php 5.3, ви можете використовувати array_mapанонімну функцію, наприклад:

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

Перед (технічно php 4.0.6+) ви повинні створити анонімну функцію, а create_functionне:

$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);

приємно, зараз якщо є нативна функція, яка схожа на function ($ar) {return $ar['id'];}повернення значення ключа, яке було б дивним! :-)
ifaour

1
ну, це не функція "все в одному", але закриття (будь-які анонімні функції) - це дуже потужна концепція, яка може бути використана для такої обробки, ви, скоріше, хочете знати, як їх використовувати.
Борис Гері

Що робити, якщо я теж хочу отримати ключ? Припустимо: $ arr = ['ball' => ['кошик' => 5]]; Я хочу отримати: $ ball = ['ball' => 5];
Анггер

2
@Angger Тоді у вас інше питання, ніж це. Не соромтеся запитувати це , доки ви детально згадуєте, яку поведінку ви очікуєте, наприклад, що має призвести, якщо вхід є ['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]].
Фігаг

З PHP7.4 ви можете використовувати array_mapфункцію стрілки:$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546

13

PHP 5.5+

Починаючи з PHP5.5 +, у вас є array_column (), доступний для вас, що робить усі наведені нижче застарілими.

PHP 5.3+

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

Рішення від @phihag буде бездоганно працювати в PHP, починаючи з PHP 5.3.0, якщо вам потрібна підтримка до цього, вам потрібно буде скопіювати цей wp_list_pluck.

PHP <5.3

Wordpress 3.1+

У Wordpress є функція, яка називається wp_list_pluck Якщо ви використовуєте Wordpress, що вирішує вашу проблему.

PHP <5.3

Якщо ви не використовуєте Wordpress , оскільки код є відкритим кодом, ви можете скопіювати вставити код у проект (і перейменувати функцію на щось, що вам більше подобається, наприклад, array_pick). Переглянути джерело тут


3

Якщо idце перший ключ у масиві, це буде робити:

$ids = array_map('current', $users);

Не варто, однак, покладатися на це. :)


-1

Ви також можете використовувати, array_reduce()якщо ви віддаєте перевагу більш функціональний підхід

Наприклад:

$userNames = array_reduce($users, function ($carry, $user) {
    array_push($carry, $user['name']);
    return $carry;
}, []);

Або якщо ви хочете бути фантазією,

$userNames = [];
array_map(function ($user) use (&$userNames){
    $userNames[]=$user['name'];
}, $users);

Цей і всі вищезазначені методи роблять цикл поза кадром;)


Ваш перший приклад не поверне масив, а лише останнє значення, знайдене для $ user ['name'] в масиві. Потрібно натиснути / додати до $ carry і повернути $ carry по мірі руху.
Прогрок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.