"iterieren" ein einzelnes Objekt oder das Indexäquivalent eines PHP-Objekts

8

Ich kann dorthin kommen, wohin ich gehe, aber ich will die schönste Straße.

Was mich hierher geführt hat, war die Suche nach dem besten Weg, eine Funktion auszuführen, die eine Sammlung von Objekten wie $dom->getElementsByTagName() oder $pdo->query('SELECT itcher FROM scratches') zurückgibt und dann - in dem Wissen, dass es nur ein Ergebnis hat - auf dieses Ergebnis zugreift.

Ich habe etwas recherchiert, aber ich würde gerne wissen, dass ich alles weiß, was es zu wissen gibt.

foreach oder alles, was über mehrere Dinge iteriert, fühlte sich aus ästhetischer Sicht albern, weil ich weiß, dass es nur einen gibt. Es in ein Array zu werfen fühlt sich an wie ein Makel, und ich möchte zu meinem Code gehen. Derjenige, den ich bisher am meisten mochte, ist $object->{'0'} , weil er so nah an $object[0] ist, wie ich gefunden habe, aber es scheint nicht in jedem Fall zu funktionieren. Gibt es etwas noch Schöneres zu sehen? Zum Beispiel, was genau macht foreach($key as $val) bei jeder Iteration, wenn ein $ Schlüssel auf $ val gesetzt wird? Kann ich das selbst machen?

Vielleicht visualisiere ich die Idee eines Objekts nicht in meinem Kopf, aber würde es nicht sinnvoller sein, wenn getElementsByTagName - und mysql-Abfragen Arrays zurückgeben? Warum nicht?

    
c.. 17.11.2012, 02:44
quelle

1 Antwort

3
  

Zum Beispiel, was genau foreach ($ key als $ val) bei jeder Iteration tut, wenn ein $ key auf $ val gesetzt wird? Kann ich das selbst machen?

Wenn es wirklich ein Array ist, können Sie das erste Element mit reset() erhalten.

Wenn es sich um Iterator handelt (was verwendet wird, um foreach Zugriff auf ein Objekt zu erlauben), dann sollten Sie $object->current();

verwenden können

Ich habe nie wirklich den zugrunde liegenden Code für foreach betrachtet - aber reset() und current() scheinen analog zu dem, was foreach zu Beginn der Iteration tun würde.

Leider sind die beiden Beispiele, auf die Sie verweisen, interne Klassen und gemäß den Dokumenten intern Klassen (Klassen, die Teil der Sprache oder einer Erweiterung sind) folgen nicht den gleichen Regeln:

  

Interne (integrierte) Klassen, die diese Schnittstelle implementieren, können in einem foreach-Konstrukt verwendet werden und müssen IteratorAggregate oder Iterator nicht implementieren.

Das heißt, alle Benutzerklassen, die Objekte zurückgeben, die von foreach iteriert werden können, sollten vom Typ Traversable sein (was foreach erfordert), also glaube ich, dass current() wie gewünscht funktionieren sollte. Beachten Sie, dass wenn das Objekt IteratorAggregate anstelle von Iterator implementiert, Sie getIterator()->current() verwenden müssen.

Es ist jedoch immer noch möglich, mit Ihren beiden Beispielen zu arbeiten - Sie verwenden nur Methoden, die für diese zurückgegebenen Typen spezifisch sind. Im Fall von getElementsByTagName() können Sie getElementsByTagName->item(0) verwenden und im Fall von PDO können Sie query()->fetch() verwenden.

    
Tim Lytle 17.11.2012, 04:27
quelle

Tags und Links