191 Stimmen

PHP - Extrahieren einer Eigenschaft aus einem Array von Objekten

Ich habe eine Reihe von Katzen-Objekten:

$cats = Array
    (
        [0] => stdClass Object
            (
                [id] => 15
            ),
        [1] => stdClass Object
            (
                [id] => 18
            ),
        [2] => stdClass Object
            (
                [id] => 23
            )
)

und ich möchte ein Array von Katzen-IDs in 1 Zeile extrahieren (weder eine Funktion noch eine Schleife).

Ich dachte an die Verwendung von array_walk con create_function aber ich weiß nicht, wie ich es machen soll.

Irgendeine Idee?

238voto

Josep Alsina Punkte 2504

Wenn Sie eine PHP 5.5 oder höher ist es am besten, die eingebaute Funktion array_column() :

$idCats = array_column($cats, 'id');

Aber der Sohn muss ein Array sein oder in ein Array umgewandelt werden

197voto

Greg Punkte 306033

Warnung create_function() wurde mit PHP 7.2.0 DEPRECATED. Es wird dringend davon abgeraten, diese Funktion in Anspruch zu nehmen.

Sie können die array_map() Funktion.
Das sollte genügen:

$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);

Wie @Relequestual weiter unten schreibt, ist die Funktion nun direkt in die array_map integriert. Die neue Version der Lösung sieht wie folgt aus:

$catIds = array_map(function($o) { return $o->id;}, $objects);

102voto

algorhythm Punkte 8122

Die Lösung hängt von der PHP-Version ab, die Sie verwenden. Es gibt mindestens 2 Lösungen:

Erste (neuere PHP-Versionen)

Wie @JosepAlsina schon sagte, ist die beste und auch kürzeste Lösung die Verwendung von array_column wie folgt:

$catIds = array_column($objects, 'id');

Hinweis: Für die Iteration einer array mit \stdClass es, wie in der Frage verwendet, ist nur mit PHP-Versionen möglich >= 7.0 . Aber bei der Verwendung eines array mit array s können Sie dasselbe tun, da PHP >= 5.5 .

Zweitens (Ältere PHP-Versionen)

@Greg sagte, dass es in älteren PHP-Versionen möglich ist, folgendes zu tun:

$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);

Aber Vorsicht: In neueren PHP-Versionen >= 5.3.0 ist es besser, zu verwenden Closure s, wie folgt:

$catIds = array_map(function($o) { return $o->id; }, $objects);

Der Unterschied

Die erste Lösung erstellt eine neue Funktion und legt sie im RAM ab. Der Garbage Collector löscht die bereits erstellte und bereits aufgerufene Funktionsinstanz aus irgendeinem Grund nicht aus dem Speicher. Und das ungeachtet der Tatsache, dass die erstellte Funktionsinstanz nie wieder aufgerufen werden kann, weil wir keinen Zeiger für sie haben. Und das nächste Mal, wenn dieser Code aufgerufen wird, wird dieselbe Funktion erneut erstellt werden. Dieses Verhalten füllt langsam Ihren Speicher...

Beide Beispiele mit Speicherausgabe, um sie zu vergleichen:

BAD

while (true)
{
    $objects = array_map(create_function('$o', 'return $o->id;'), $objects);

    echo memory_get_usage() . "\n";

    sleep(1);
}

// the output
4235616
4236600
4237560
4238520
...

GUT

while (true)
{
    $objects = array_map(function($o) { return $o->id; }, $objects);

    echo memory_get_usage() . "\n";

    sleep(1);
}

// the output
4235136
4235168
4235168
4235168
...

Dies kann auch hier diskutiert werden

Speicherleck?! Macht der Garbage Collector alles richtig, wenn er 'create_function' innerhalb von 'array_map' verwendet?

4voto

SilentGhost Punkte 285785
function extract_ids($cats){
    $res = array();
    foreach($cats as $k=>$v) {
        $res[]= $v->id;
    }
    return $res
}

und verwenden Sie es in einer Zeile :

$ids = extract_ids($cats);

3voto

soulmerge Punkte 70900

Warnung create_function() wurde mit PHP 7.2.0 DEPRECATED. Es wird dringend davon abgeraten, diese Funktion in Anspruch zu nehmen.

Eingebaute Schleifen in PHP sind schneller als interpretierte Schleifen, daher ist es sinnvoll, diese Schleife zu einem Einzeiler zu machen:

$result = array();
array_walk($cats, create_function('$value, $key, &$result', '$result[] = $value->id;'), $result)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X