Come ottenere un array di una "chiave" specifica in un array multidimensionale senza loop


115

Supponiamo di avere il seguente array multidimensionale (recuperato da MySQL o da un servizio):

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

Possiamo ottenere un array di ids in una chiamata di funzione php " incorporata "? o una riga di codice?
Sono consapevole del looping tradizionale e ne ricavo il valore ma non ne ho bisogno:

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

Forse alcuni array_map()e call_user_func_array()possono fare la magia.


"Possiamo ottenere un array di ID in una chiamata di funzione?" sì, ma dovrai scrivere la funzione
:)

@ BorisGuéry, volevo dire built-in funzioni :-)
ifaour

2
PS: sono consapevole di poter scrivere foreach($users as $user) {$ids[] = $user['id'];}in una riga! ma sai cosa intendo / ho bisogno :-)
ifaour

@ Eugene, ovviamente ho bisogno dell'array per altre cose. E ancora, questo è solo per divertimento e imparare nuove scorciatoie in PHP.
ifaour

Risposte:


261

A partire da php 5.5, puoi usare array_column:

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

Questa è l'opzione preferita su qualsiasi progetto moderno. Tuttavia, se devi supportare php> 5.5, esistono le seguenti alternative:

A partire da php 5.3, puoi usare array_mapcon una funzione anonima, come questa:

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

Prima di (tecnicamente php 4.0.6+) , devi creare una funzione anonima con create_functioninvece:

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

bello, ora se c'è una funzione nativa simile al function ($ar) {return $ar['id'];}valore di ritorno della chiave sarebbe fantastico! :-)
ifaour

1
beh, questa non è una funzione "tutto in uno", ma la chiusura (funzioni anonime) è un concetto molto potente che può essere utilizzato per tale elaborazione, piuttosto ti piacerà sapere come usarle.
Boris Guéry

E se volessi avere anche la chiave? Supponiamo: $ arr = ['ball' => ['basket' => 5]]; Voglio ottenere: $ ball = ['ball' => 5];
Angger

2
@Angger Allora hai una domanda diversa da questa. Sentiti libero di chiederlo fintanto che dici in dettaglio quale comportamento ti aspetti, ad esempio cosa dovrebbe risultare se l'input è ['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]].
phihag

Da PHP7.4 puoi usare array_mapcon una funzione freccia:$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546

13

PHP 5.5+

A partire da PHP5.5 + hai a disposizione array_column () , il che rende obsoleto tutto quanto sotto.

PHP 5.3+

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

La soluzione di @phihag funzionerà perfettamente in PHP a partire da PHP 5.3.0, se hai bisogno di supporto prima, dovrai copiare quel wp_list_pluck.

PHP <5.3

Wordpress 3.1+

In Wordpress c'è una funzione chiamata wp_list_pluck Se stai usando Wordpress che risolve il tuo problema.

PHP <5.3

Se non stai usando Wordpress , poiché il codice è open source, puoi copiare e incollare il codice nel tuo progetto (e rinominare la funzione con qualcosa che preferisci, come array_pick). Visualizza la fonte qui


3

Se idè la prima chiave nell'array, questo farà:

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

Tuttavia, non dovresti necessariamente fare affidamento su questo. :)


-1

Puoi anche usare array_reduce()se preferisci un approccio più funzionale

Per esempio:

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

O se ti piace essere stravagante,

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

Questo e tutti i metodi sopra riportati vengono eseguiti in loop dietro le quinte;)


Il tuo primo esempio non restituirà un array, ma solo l'ultimo valore trovato per $ user ['name'] nell'array. Devi premere / aggiungere $ carry e restituire $ carry mentre procedi.
Progrock
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.