2009-08-22 9 views
81

Ich habe ein stdClass-Objekt aus json_decode erstellt, das nicht die richtige Zahl zurückgibt, wenn ich die Funktion count ($ obj) ausführe. Das Objekt hat 30 Eigenschaften, aber die Rückkehr auf die count() - Funktion ist sagen 1.PHP: Zähle ein stdClass-Objekt

Irgendwelche Ideen?

Unten ist ein Beispiel für eines der Objekte. (Ich verlange die täglichen Trendinformationen von Twitter). Wenn dieses Objekt mehr als eine Eigenschaft hat, würde die count ($ obj) gleich 1.

[trends] => stdClass Object 
    (
     [2009-08-21 11:05] => Array 
      (
       [0] => stdClass Object 
        (
         [query] => "Follow Friday" 
         [name] => Follow Friday 
        ) 

       [1] => stdClass Object 
        (
         [query] => "Inglourious Basterds" OR "Inglorious Basterds" 
         [name] => Inglourious Basterds 
        ) 

       [2] => stdClass Object 
        (
         [query] => Inglourious 
         [name] => Inglourious 
        ) 

       [3] => stdClass Object 
        (
         [query] => #songsincode 
         [name] => #songsincode 
        ) 

       [4] => stdClass Object 
        (
         [query] => #shoutout 
         [name] => #shoutout 
        ) 

       [5] => stdClass Object 
        (
         [query] => "District 9" 
         [name] => District 9 
        ) 

       [6] => stdClass Object 
        (
         [query] => #howmanypeople 
         [name] => #howmanypeople 
        ) 

       [7] => stdClass Object 
        (
         [query] => Ashes OR #ashes 
         [name] => Ashes 
        ) 

       [8] => stdClass Object 
        (
         [query] => #youtubefail 
         [name] => #youtubefail 
        ) 

       [9] => stdClass Object 
        (
         [query] => TGIF 
         [name] => TGIF 
        ) 

       [10] => stdClass Object 
        (
         [query] => #wish09 
         [name] => #wish09 
        ) 

       [11] => stdClass Object 
        (
         [query] => #watch 
         [name] => #watch 
        ) 

       [12] => stdClass Object 
        (
         [query] => Avatar 
         [name] => Avatar 
        ) 

       [13] => stdClass Object 
        (
         [query] => Ramadhan 
         [name] => Ramadhan 
        ) 

       [14] => stdClass Object 
        (
         [query] => Goodnight 
         [name] => Goodnight 
        ) 

       [15] => stdClass Object 
        (
         [query] => iPhone 
         [name] => iPhone 
        ) 

       [16] => stdClass Object 
        (
         [query] => #iranelection 
         [name] => #iranelection 
        ) 

       [17] => stdClass Object 
        (
         [query] => Apple 
         [name] => Apple 
        ) 

       [18] => stdClass Object 
        (
         [query] => "Usain Bolt" 
         [name] => Usain Bolt 
        ) 

       [19] => stdClass Object 
        (
         [query] => H1N1 
         [name] => H1N1 
        ) 

      ) 
    ) 
+3

Können Sie Ihr Beispiel verdeutlichen? Wie Sie es gepostet haben, hat es eine Eigenschaft '2009-08-21 11: 05', die ein Array mit 20 Einträgen ist, also würde count ($ trends) zu Recht zurückgeben. 1 [ –

+1

] [Steven wies darauf hin] (http://Paketüberfluss.com/questions/1314745/php-count-an-stdclass-object/1314754 # 1314754), das Objekt hat den Typ stdClass, der die Countable-Schnittstelle nicht implementiert, daher gibt count () immer 1. –

+0

zurück Hopel, du hast genau recht. Wenn ich das Objekt in ein Array umwandle, gibt es die richtige Zahl zurück! Ausgezeichnet. – hellopat

Antwort

168

Das Problem ist, dass Zählung sollte die Indizes in einem Array zählen, nicht die Eigenschaften auf einem Objekt, (es sei denn, es ist ein benutzerdefiniertes Objekt, das die Countable-Schnittstelle implementiert). Versuchen Sie, das Objekt, wie unten, als Array auszugeben, und sehen Sie, ob das hilft.

Einfach ein Objekt als Array zu konvertieren wird nicht immer funktionieren, aber als einfaches stdClass-Objekt sollte es hier erledigt werden.

+8

Achten Sie darauf, dass private Eigenschaften im resultierenden Array angezeigt werden, was wirklich unerwartet ist. –

+9

Während diese Methode funktioniert, würde ich es nicht für die Implementierung verwenden, da zukünftige Versionen von PHP diesen Code zum Bruch bringen könnten, ich bevorzuge Alan Strom's Antwort sehr. – ars265

9

Das Objekt verfügt nicht über 30 Eigenschaften. Es hat einen, der ein Array mit 30 Elementen ist. Sie benötigen die Anzahl der Elemente in diesem Array.

+1

Wenn man die Daten ein wenig weiter anstößt, könnte es besser sein, den $ assoc param mit json_encode zu verwenden, der ihn in ein Array konvertiert. Diese Eigenschaft, die du bekommst, wird aus dem Zeitstempel benannt, was ein richtiger Schmerz sein wird, um regelmäßig zuzugreifen. Als Array könnte man einfach zählen ($ trends [0]); –

+0

Ich hätte wahrscheinlich ein besseres Beispiel geben sollen. Das stdClass-Objekt hat mehr als nur das, das ich im Beispiel angegeben habe. Es hat 32, jedes enthält ein Array mit 20 Elementen. – hellopat

4

Es gibt nichts mit Zählung falsch ist() hier, "Trends" ist der einzige Schlüssel, die in diesem Fall gezählt wird, können Sie tun versuchen:

count($obj->trends); 

Oder:

count($obj->trends['2009-08-21 11:05']); 

oder vielleicht sogar tun:

count($obj, COUNT_RECURSIVE); 
85

Die Zählfunktion auf

verwendet werden soll
  1. Arrays
  2. Objekte, die von Klassen abgeleitet werden, die die zählbare Schnittstelle

A stdClass beides nicht implementieren ist. Je einfacher/schnellste Weg zu erreichen, was Sie wollen ist

$count = count(get_object_vars($some_std_class_object)); 

Diese nutzt PHP get_object_vars Funktion, die die Eigenschaften eines Objekts als Array zurück. Sie können dieses Array dann mit der Zählfunktion von PHP verwenden.

+0

Vor PHP 7 ergibt 'get_object_vars()' auf einer 'stdClass', die aus dem Umsetzen eines Arrays auf ein Objekt resultiert, ein leeres Array. Das Übergeben der 'stdClass' -Instanz an ein Array hingegen funktioniert überall. – XedinUnknown

-2

count() Funktion arbeitet mit Array. Wenn Sie jedoch die Länge des Objekts zählen möchten, können Sie diese Methode verwenden.

$total = $obj->length; 
0

Gerade diese

$i=0; 
foreach ($object as $key =>$value) 
{ 
$i++; 
} 

die Variable $i Anzahl von Tasten verwenden ist.