PHP: Policz obiekt stdClass

121

Mam obiekt stdClass utworzony na podstawie json_decode, który nie zwróci właściwej liczby po uruchomieniu funkcji count ($ obj). Obiekt ma 30 właściwości, ale wartość zwracana przez funkcję count () to powiedzmy 1.

Jakieś pomysły?

Poniżej przykład jednego z obiektów. (Proszę o codzienne informacje o trendach z Twittera). Gdyby ten obiekt miał więcej niż jedną właściwość, liczba ($ obj) byłaby równa 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
źródło
3
Czy mógłbyś wyjaśnić swój przykład? Jak to pisał, to ma jedną właściwość 2009-08-21 11:05, jest tablicą z 20 pozycji, więc liczyć ($ trendy) byłoby słusznie zwraca 1.
Henrik Opel
1
Jak zauważył Steven , obiekt jest typu stdClass, który nie implementuje interfejsu Countable, więc count (<obiekt stdClass>) zawsze zwróci 1.
Henrik Opel
Hopel, masz całkowitą rację. Jeśli rzucę obiekt na tablicę, zwraca poprawną liczbę! Doskonały.
hellopat
możesz przyjąć odpowiedź. Zwłaszcza że napisałeś w komentarzu, że pierwsza podana odpowiedź działa dla Ciebie.
Andresch Serj

Odpowiedzi:

253

Problem polega na tym, że funkcja count służy do zliczania indeksów w tablicy, a nie właściwości obiektu (chyba że jest to obiekt niestandardowy, który implementuje interfejs Countable). Spróbuj rzucić obiekt, jak poniżej, jako tablicę i zobacz, czy to pomoże.

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

Zwykłe rzutowanie obiektu jako tablicy nie zawsze będzie działać, ale będąc prostym obiektem stdClass, powinno wykonać zadanie tutaj.

Steven Surowiec
źródło
9
uważaj, że w wynikowej tablicy pojawią się prywatne własności, co jest naprawdę nieoczekiwane.
Hugo Mota,
14
Chociaż ta metoda działa, nie użyłbym jej do implementacji, ponieważ przyszłe wersje PHP mogą spowodować uszkodzenie tego kodu, zdecydowanie wolę odpowiedź Alana Stroma.
ars265
109

Funkcja zliczania ma być używana na

  1. Tablice
  2. Obiekty, które są pochodnymi klas implementujących policzalny interfejs

StdClass nie jest żadnym z tych. Najłatwiejszym / najszybszym sposobem na osiągnięcie tego, czego szukasz, jest

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

Wykorzystuje funkcję PHP get_object_vars , która zwraca właściwości obiektu jako tablicę. Możesz następnie użyć tej tablicy z funkcją count PHP.

Alan Storm
źródło
1
Przed PHP 7, get_object_vars()w stdClasswyniku rzutowania tablicy na obiekt, pojawi się pusta tablica. stdClassZ drugiej strony rzutowanie instancji na tablicę działa wszędzie.
XedinUnknown
Działa dla mnie na PHP 5.6.30
R. Daumann,
8

Obiekt nie ma 30 właściwości. Ma jeden, który jest tablicą składającą się z 30 elementów. Potrzebujesz liczby elementów w tej tablicy.

Rob Drimmie
źródło
1
Szperając nieco bardziej w danych, może lepiej byłoby użyć parametru $ assoc z json_encode, który konwertuje go na tablicę. Ta właściwość, którą otrzymujesz, jest nazwana na podstawie sygnatury czasowej, do której regularnie będziesz mieć dostęp. Jako tablicę możesz po prostu policzyć ($ trendy [0]);
Rob Drimmie
Powinienem był podać lepszy przykład. Obiekt stdClass ma więcej niż tylko ten, który podałem w przykładzie. Ma 32, z których każdy zawiera tablicę z 20 elementami.
hellopat
5

Nie ma nic złego w count () tutaj, „trendy” to jedyny klucz, który jest liczony w tym przypadku, możesz spróbować:

count($obj->trends);

Lub:

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

A może nawet robiąc:

count($obj, COUNT_RECURSIVE);
Alix Axel
źródło
1

Po prostu użyj tego

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

zmienną $ijest liczba kluczy.

Arash Younesi
źródło
0

Policz normalną arryę lub obiekt

count($object_or_array); 

Policz wielowymiarową arryę lub obiekt

count($object_or_array, 1); // 1 for  multidimensional array count, 0 for Default
Himal Majumder
źródło
-4

count()funkcja działa z tablicą. Ale jeśli chcesz policzyć długość obiektu, możesz użyć tej metody.

$total = $obj->length;
WaQaR Ali
źródło