So erhalten Sie ein Array mit einem bestimmten „Schlüssel“ in einem mehrdimensionalen Array ohne Schleifen

114

Nehmen wir an, ich habe das folgende mehrdimensionale Array (von MySQL oder einem Dienst abgerufen):

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

Können wir ein Array von ids in einem " eingebauten " PHP-Funktionsaufruf erhalten? oder eine Codezeile?
Ich bin mir der traditionellen Schleife bewusst und erhalte den Wert, aber ich brauche dies nicht:

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

Vielleicht einige array_map()und call_user_func_array()können die Magie tun.

ifaour
quelle
"Können wir in einem Funktionsaufruf ein Array von IDs erhalten?" Ja, aber Sie müssen die Funktion schreiben
:)
@ BorisGuéry, ich meinte eingebaute Funktionen :-)
ifaour
2
PS: Mir ist bewusst, dass ich foreach($users as $user) {$ids[] = $user['id'];}in einer Zeile schreiben kann ! aber du weißt was ich meine / brauche :-)
ifaour
@ Eugene, ich brauche das Array natürlich für andere Dinge. Und wieder ist dies nur zum Spaß und zum Erlernen neuer Abkürzungen in PHP.
ifaour

Antworten:

260

Seit PHP 5.5 können Sie verwenden array_column:

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

Dies ist die bevorzugte Option für jedes moderne Projekt. Wenn Sie jedoch PHP> 5.5 unterstützen müssen, gibt es die folgenden Alternativen:

Seit PHP 5.3 können Sie array_mapmit einer anonymen Funktion wie folgt verwenden:

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

Vor (Technisch PHP 4.0.6+) müssen Sie create_functionstattdessen eine anonyme Funktion erstellen mit :

$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);
Phihag
quelle
Schön, wenn es eine native Funktion gibt, die dem function ($ar) {return $ar['id'];}Rückgabewert des Schlüssels ähnelt , wäre das fantastisch! :-)
ifaour
1
Nun, das ist keine "All-in-One" -Funktion, aber Closure (anynonyme Funktionen) sind ein sehr leistungsfähiges Konzept, das für eine solche Verarbeitung verwendet werden kann. Sie möchten lieber wissen, wie man sie verwendet.
Boris Guéry
Was ist, wenn ich auch den Schlüssel bekommen möchte? Angenommen, $ arr = ['ball' => ['Basket' => 5]]; Ich möchte erhalten: $ ball = ['ball' => 5];
Angger
2
@ Angger Dann hast du eine andere Frage als diese. Sie können es gerne fragen, solange Sie im Detail angeben, welches Verhalten Sie erwarten, beispielsweise was sich ergeben sollte, wenn die Eingabe erfolgt ['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]].
Phihag
Seit PHP7.4 können Sie array_mapmit einer Pfeilfunktion verwenden :$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546
13

PHP 5.5+

Ab PHP5.5 + steht Ihnen array_column () zur Verfügung, wodurch alle folgenden Punkte überholt sind.

PHP 5.3+

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

Die Lösung von @phihag funktioniert in PHP ab PHP 5.3.0 einwandfrei. Wenn Sie zuvor Unterstützung benötigen, müssen Sie diesen wp_list_pluck kopieren.

PHP <5,3

Wordpress 3.1+

In Wordpress gibt es eine Funktion namens wp_list_pluck. Wenn Sie Wordpress verwenden, wird Ihr Problem gelöst.

PHP <5,3

Wenn Sie Wordpress nicht verwenden , können Sie den Code kopieren und in Ihr Projekt einfügen, da der Code Open Source ist (und die Funktion in etwas umbenennen, das Sie bevorzugen, wie array_pick). Quelle hier anzeigen

Norris
quelle
3

Wenn dies idder erste Schlüssel im Array ist, reicht Folgendes aus:

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

Darauf sollten Sie sich jedoch nicht unbedingt verlassen. :) :)

täuschen
quelle
-1

Sie können auch verwenden, array_reduce()wenn Sie einen funktionaleren Ansatz bevorzugen

Zum Beispiel:

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

Oder wenn Sie Lust haben,

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

Diese und alle oben genannten Methoden führen jedoch eine Schleife hinter die Kulissen;)

Muraguri E.
quelle
Ihr erstes Beispiel gibt kein Array zurück, sondern nur den letzten Wert, der für $ user ['name'] im Array gefunden wurde. Sie müssen den $ Carry pushen / anhängen und den $ Carry zurückgeben, während Sie gehen.
Progrock