Comment obtenir un tableau de «clé» spécifique dans un tableau multidimensionnel sans boucle

115

Supposons que j'ai le tableau multidimensionnel suivant (récupéré à partir de MySQL ou d'un service):

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

Pouvons-nous obtenir un tableau de ids dans un seul appel de fonction php " intégré "? ou une ligne de code?
Je suis conscient de la boucle traditionnelle et de l'obtention de la valeur, mais je n'en ai pas besoin:

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

Peut-être certains array_map()et call_user_func_array()peut faire la magie.

ifaour
la source
"Pouvons-nous obtenir un tableau d'identifiants en un seul appel de fonction?" oui, mais il va falloir écrire la fonction
:)
@ BorisGuéry, je voulais dire intégré dans les fonctions :-)
ifaour
2
PS: Je sais que je peux écrire foreach($users as $user) {$ids[] = $user['id'];}en une seule ligne! mais vous savez ce que je veux dire / besoin :-)
ifaour
@Eugene, j'ai besoin du tableau pour d'autres choses évidemment. Et encore une fois, ce n'est que pour le plaisir et l'apprentissage de nouveaux raccourcis en PHP.
ifaour

Réponses:

261

Depuis php 5.5, vous pouvez utiliser array_column:

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

C'est l'option préférée sur tout projet moderne. Cependant, si vous devez prendre en charge php> 5.5, les alternatives suivantes existent:

Depuis php 5.3, vous pouvez utiliser array_mapavec une fonction anonyme, comme ceci:

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

Avant (techniquement php 4.0.6+) , vous devez créer une fonction anonyme avec à la create_functionplace:

$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);
Phihag
la source
bien, maintenant s'il y a une fonction native similaire à la function ($ar) {return $ar['id'];}valeur de retour de la clé, ce serait génial! :-)
ifaour
1
eh bien, ce n'est pas une fonction "tout en un", mais Closure (fonctions anonymes) est un concept très puissant qui peut être utilisé pour un tel traitement, vous aimerez plutôt savoir comment les utiliser.
Boris Guéry
Et si je veux aussi obtenir la clé? Supposons: $ arr = ['ball' => ['basket' => 5]]; Je veux obtenir: $ ball = ['ball' => 5];
Angger
2
@Angger Alors vous avez une question différente de celle-ci. N'hésitez pas à le poser tant que vous mentionnez en détail le comportement que vous attendez, par exemple ce qui devrait résulter si l'entrée est ['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]].
phihag
Depuis PHP7.4, vous pouvez utiliser array_mapavec une fonction de flèche:$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546
13

PHP 5.5+

À partir de PHP5.5 +, vous avez array_column () à votre disposition, ce qui rend tous les éléments ci-dessous obsolètes.

PHP 5.3+

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

La solution de @phihag fonctionnera parfaitement en PHP à partir de PHP 5.3.0, si vous avez besoin de support avant cela, vous devrez copier ce wp_list_pluck.

PHP <5,3

Wordpress 3.1+

Dans Wordpress, il existe une fonction appelée wp_list_pluck Si vous utilisez Wordpress, cela résout votre problème.

PHP <5,3

Si vous n'utilisez pas Wordpress , puisque le code est open source, vous pouvez copier-coller le code dans votre projet (et renommer la fonction en quelque chose que vous préférez, comme array_pick). Voir la source ici

Norris
la source
3

Si idest la première clé du tableau, cela fera:

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

Cependant, vous ne devriez pas nécessairement vous y fier. :)

déceler
la source
-1

Vous pouvez également utiliser array_reduce()si vous préférez une approche plus fonctionnelle

Par exemple:

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

Ou si tu aimes être chic,

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

Ceci et toutes les méthodes ci-dessus font une boucle dans les coulisses;)

Muraguri E
la source
Votre premier exemple ne retournera pas de tableau, juste la dernière valeur trouvée pour $ user ['name'] dans le tableau. Vous devez pousser / ajouter au $ carry et retourner le $ carry au fur et à mesure.
Progrock