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
                    )

            )
     )

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.


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.


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.


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);

1

Po prostu użyj tego

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

zmienną $ijest liczba kluczy.


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

-4

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

$total = $obj->length;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.