PHP: Zähle ein stdClass-Objekt

121

Ich habe ein stdClass-Objekt aus json_decode erstellt, das nicht die richtige Nummer zurückgibt, wenn ich die Funktion count ($ obj) ausführe. Das Objekt hat 30 Eigenschaften, aber die Rückgabe der Funktion count () lautet beispielsweise 1.

Irgendwelche Ideen?

Unten sehen Sie ein Beispiel für eines der Objekte. (Ich fordere die täglichen Trendinformationen von Twitter an). Wenn dieses Objekt mehr als eine Eigenschaft hätte, wäre die Anzahl ($ 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
                    )

            )
     )
hellopat
quelle
3
Könnten Sie Ihr Beispiel klarstellen? Wie Sie es gepostet haben, hat es eine Eigenschaft 2009-08-21 11:05, ein Array mit 20 Einträgen, so dass count ($ Trends) zu Recht 1 zurückgeben würde.
Henrik Opel
1
Wie Steven betonte, ist das Objekt vom Typ stdClass, der die Countable-Schnittstelle nicht implementiert. Daher gibt count (<stdClass object>) immer 1 zurück.
Henrik Opel
Hopel, du bist genau richtig. Wenn ich das Objekt in ein Array umwandle, wird die richtige Nummer zurückgegeben! Ausgezeichnet.
Hellopat
Vielleicht möchten Sie eine Antwort akzeptieren. Besonders geiven, dass Sie in dem Kommentar geschrieben haben, dass die erste gegebene Antwort für Sie funktioniert.
Andresch Serj

Antworten:

252

Das Problem ist, dass count die Indizes in einem Array zählen soll, nicht die Eigenschaften eines Objekts (es sei denn, es handelt sich um ein benutzerdefiniertes Objekt, das die Countable-Schnittstelle implementiert). Versuchen Sie, das Objekt wie unten als Array zu verwenden, und prüfen Sie, ob dies hilfreich ist.

$total = count((array)$obj);

Das einfache Umwandeln eines Objekts als Array funktioniert nicht immer, aber als einfaches stdClass-Objekt sollte es die Aufgabe hier erledigen.

Steven Surowiec
quelle
9
Beachten Sie, dass private Eigenschaften im resultierenden Array angezeigt werden, was wirklich unerwartet ist.
Hugo Mota
14
Während diese Methode funktioniert, würde ich sie nicht für die Implementierung verwenden, da zukünftige Versionen von PHP dazu führen könnten, dass dieser Code beschädigt wird. Ich bevorzuge die Antwort von Alan Strom.
Ars265
109

Die Zählfunktion soll für verwendet werden

  1. Arrays
  2. Objekte, die von Klassen abgeleitet sind, die die zählbare Schnittstelle implementieren

Eine stdClass ist keine davon. Der einfachere / schnellste Weg, um das zu erreichen, wonach Sie suchen, ist

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

Dies verwendet die PHP- Funktion get_object_vars , die die Eigenschaften eines Objekts als Array zurückgibt . Sie können dieses Array dann mit der Zählfunktion von PHP verwenden.

Alan Storm
quelle
1
Bevor PHP 7, get_object_vars()auf einem , stdClassdie in Folge um ein Array zu einem Objekt vom Gießen wird ein leeres Array ergeben. Das Casting der stdClassInstanz in ein Array funktioniert dagegen überall.
XedinUnknown
Funktioniert für mich auf PHP 5.6.30
R. Daumann
8

Das Objekt hat keine 30 Eigenschaften. Es hat eines, ein Array mit 30 Elementen. Sie benötigen die Anzahl der Elemente in diesem Array.

Rob Drimmie
quelle
1
Wenn Sie die Daten etwas genauer betrachten, ist es möglicherweise besser, den Parameter $ assoc mit json_encode zu verwenden, der sie in ein Array konvertiert. Die Eigenschaft, die Sie erhalten, ist nach dem Zeitstempel benannt, auf den Sie regelmäßig zugreifen können. Als Array können Sie einfach zählen ($ Trends [0]);
Rob Drimmie
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, die jeweils ein Array mit 20 Elementen enthalten.
Hellopat
5

An count () ist hier nichts auszusetzen. "Trends" ist der einzige Schlüssel, der in diesem Fall gezählt wird. Sie können Folgendes versuchen:

count($obj->trends);

Oder:

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

Oder vielleicht sogar:

count($obj, COUNT_RECURSIVE);
Alix Axel
quelle
1

Verwenden Sie einfach diese

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

Die Variable $iist die Anzahl der Schlüssel.

Arash Younesi
quelle
0

Zähle normale Arrya oder Objekt

count($object_or_array); 

Zählen Sie mehrdimensionale Arrya oder Objekte

count($object_or_array, 1); // 1 for  multidimensional array count, 0 for Default
Himal Majumder
quelle
-4

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

$total = $obj->length;
WaQaR Ali
quelle