Angenommen, ich habe eine einfache Klasse wie:
class MyClass {
private $_prop;
public function getProp() {return $this->_prop;}
[....]
}
Nun, was ich irgendwo tun möchte, liegt nicht im Bereich MyClass
ist, ein Array von $_prop aus einem Array von Objekten zu erhalten MyClass
($objs
). Das geht natürlich mit folgendem Code:
$props = array();
foreach ($objs as $obj) {
$props[] = $obj->getProp();
}
Dies erfordert jedoch einige Zeilen, insbesondere wenn es auf diese Weise formatiert ist (und ich muss eine solche Formatierung verwenden). Die Frage ist also: Ist dies mit array_map möglich? Eine Möglichkeit wäre, die create-Funktion zu verwenden, aber ich mag das in PHP nicht wirklich (Lambdas in PHP sind zumindest umständlich und wenn ich das richtig verstehe, ist ihre Leistung wie die von bewertetem Code, aber die Leistung ist hier nebensächlich). Ich habe es satt, ziemlich viel zu suchen und keine eindeutige Antwort zu finden. Aber ich habe irgendwie das Gefühl, dass es nicht möglich ist. Ich habe Dinge ausprobiert wie array_map(array('MyClass', 'getProp'), $objs)
aber das funktioniert nicht, da die Methode nicht statisch ist.
Bearbeiten: Ich verwende PHP 5.3.
Was ist falsch an der Foreach-Schleife? Es sind nur vier Zeilen Code. Welche PHP-Version verwendest du?
– Felix Klinge
27. Juli 2011 um 6:59 Uhr
Es ist nur so, dass array_map das Potenzial hat, viel sauberer zu sein, und ich mag funktionale Techniken. Aber natürlich ist PHP keine funktionale Sprache, also … Trotzdem wäre es cool, wenn dies möglich wäre. Da es in Wirklichkeit wie eine triviale Funktionalität für Sprache erscheint, irgendwie.
– Morpheln
27. Juli 2011 um 7:03 Uhr
Was genau könnte sauberer sein? Sie übergeben den Inhalt des Arrays einzeln an den Callback. Das ist so ziemlich dasselbe wie in Ruby, Python und JavaScript.
– Gordon
27. Juli 2011 um 7:39 Uhr
Pseudo-Code
array_map(array('MyClass', 'getProp'), $objs)
Wo nicht statische Methode aufgerufen wird, wäre sauberer. Eine kompakte Linie. Es ist nicht erforderlich, ein leeres Array zu erstellen. Es ist nicht erforderlich, Objekte manuell zu loopen und auf das Array zu schieben. Geben Sie einfach ein Array an und nehmen Sie ein anderes. Natürlich funktioniert diese Idee nicht gut mit oop und esp mit dynamischer Lose-Typisierung, die PHP verwendet … Aber es könnte trotzdem gemacht werden 🙂– Morpheln
27. Juli 2011 um 7:46 Uhr
Aber das ist nicht was
array_map
tut. Es tutcallback($element)
für jedes $element im Array. Was du beschreibst wäre$element->callback()
stattdessen.– Gordon
27. Juli 2011 um 7:49 Uhr