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.