Wie verwendet man implode eine Spalte aus einem Array von stdClass-Objekten? [duplicate]

Lesezeit: 2 Minuten

Benutzer-Avatar
allgegenwärtig

Ich habe eine Reihe von stdClass Objekte und ich möchte eine durch Kommas getrennte Liste mit einem bestimmten Feld von all diesen erstellen stdClass Objekte. Mein Array sieht so aus:

$obj1 = stdClass Object ( [foo] => 4 [bar] => 8 [foo-bar] => 15 );
$obj2 = stdClass Object ( [foo] => 16 [bar] => 23 [foo-bar] => 42 );
$obj3 = stdClass Object ( [foo] => 76 [bar] => 79 [foo-bar] => 83 );

$a = array(1=>$obj1 , 2=>$obj2 , 3=>$obj3);

Und ich möchte weiter implodieren foo von allen stdClass Objekte in diesem Array, um eine durch Kommas getrennte Liste zu erstellen. Das gewünschte Ergebnis ist also:

4,16,76

Gibt es eine Möglichkeit, dies mit implode (oder einer anderen mysteriösen Funktion) zu tun, ohne dieses Array von Objekten durch eine Schleife führen zu müssen?

  • vielleicht, wenn Sie die Methode toString() des Objekts überladen.

    – clentfort

    31. Mai 2012 um 12:52 Uhr

Du könntest benutzen array_map() und implode()

$a = array_map(function($obj) { return $obj->foo; }, 
               array(1=>$obj1 , 2=>$obj2 , 3=>$obj3));

$a = implode(", ", $a);

  • Dies funktioniert und ist sauberer als eine Schleife, leider finde ich, dass eine Foreach-Schleife besser abschneidet. Ich erhalte ähnliche Ergebnisse mit array_reduce 🙁 Schätze, ich bleibe einfach bei der foreach-Schleife.

    – allgegenwärtig

    31. Mai 2012 um 15:02 Uhr

Mit PHP 7.0+ können Sie verwenden array_column dafür.

echo implode(',', array_column($a, 'foo'));

  • Funktioniert nur, wenn foo öffentlich deklariert ist.

    – Jochen Jung

    20. Februar 2020 um 19:34 Uhr

  • @JochenJung Können Sie nicht-öffentliche Eigenschaften in einem StdClass-Objekt haben?

    – Keine Panik

    20. Februar 2020 um 19:42 Uhr

Benutzer-Avatar
Kristofer Doman

Dies ist eigentlich der beste Weg, den ich gefunden habe, es scheint hier nicht richtig beantwortet zu werden, da das Array von Objekten in der Lage sein sollte, dynamische Größe zu verarbeiten.

$str = implode(',', array_map(function($x) { return $x->foo; }, $a));

Benutzer-Avatar
Stahl

Kann man eigentlich einstellen __toString() auf der Klasse, wie von Ray vorgeschlagen, aber Sie müssen nicht durch die iterieren array Erste. implode() werde die direkt anrufen __toString() Funktion der Objekte (was übrigens auch mit assoziativen Arrays funktioniert).

Eine sehr nette Lösung dafür ist die array_reduce() Funktion, die ein Array auf einen einzelnen Wert reduziert:

$str = array_reduce($a, function($v, $w) {
    if ($v) $v .= ',';
    return $v . $w->foo;
});

Benutzer-Avatar
Alex

echo implode("','",(array)$data->stdArray);

Benutzer-Avatar
schattig

Ich denke, der einfachste Weg wäre, ein ID-indiziertes Array zu erstellen und dann implode für array_keys aufzurufen:

$a = array();
$a[4] = stdClass Object ( [foo] => 4 [bar] => 8 [foo-bar] => 15 );
$a[16] = stdClass Object ( [foo] => 16 [bar] => 23 [foo-bar] => 42 );
$a[76] = stdClass Object ( [foo] => 76 [bar] => 79 [foo-bar] => 83 );

echo implode(', ', array_keys($a));

1046800cookie-checkWie verwendet man implode eine Spalte aus einem Array von stdClass-Objekten? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy