PHP: cuenta un objeto stdClass

121

Tengo un objeto stdClass creado a partir de json_decode que no devolverá el número correcto cuando ejecuto la función count ($ obj). El objeto tiene 30 propiedades, pero el retorno de la función count () es digamos 1.

¿Algunas ideas?

A continuación se muestra un ejemplo de uno de los objetos. (Estoy solicitando la información diaria de tendencias de Twitter). Si este objeto tuviera más de una propiedad, el recuento ($ obj) sería igual a 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
                    )

            )
     )
holapat
fuente
3
¿Podrías aclarar tu ejemplo? A medida que lo publicó, tiene una propiedad 2009-08-21 11:05, que es una matriz con 20 entradas, por lo que contar ($ tendencias) con razón devolvería 1.
Henrik Opel
1
Como Steven señaló , el Objeto es de tipo stdClass, que no implementa la interfaz Contable, por lo tanto, count (<objeto stdClass>) siempre devolverá 1.
Henrik Opel
Hopel, tienes toda la razón. Si lanzo el objeto a una matriz, ¡devuelve el número correcto! Excelente.
hellopat el
Es posible que desee aceptar una respuesta. especialmente dado que escribiste en el comentario que la primera respuesta dada funciona para ti.
Andresch Serj

Respuestas:

253

El problema es que cuenta tiene la intención de contar los índices en una matriz, no las propiedades de un objeto (a menos que sea un objeto personalizado que implemente la interfaz contable). Intente lanzar el objeto, como a continuación, como una matriz y ver si eso ayuda.

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

Simplemente convertir un objeto como una matriz no siempre funcionará, pero al ser un simple objeto stdClass, debería hacer el trabajo aquí.

Steven Surowiec
fuente
9
Tenga en cuenta que las propiedades privadas aparecerán en la matriz resultante, lo cual es realmente inesperado.
Hugo Mota
14
Si bien este método funciona, no lo usaría para la implementación porque las versiones futuras de PHP podrían causar que este código se rompa, prefiero la respuesta de Alan Strom.
ars265
109

La función de conteo está destinada a ser utilizada en

  1. Matrices
  2. Objetos derivados de clases que implementan la interfaz contable

Un stdClass no es ninguno de estos. La forma más fácil / rápida de lograr lo que buscas es

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

Esto utiliza la función get_object_vars de PHP , que devolverá las propiedades de un objeto como una matriz. Luego puede usar esta matriz con la función de conteo de PHP.

Alan Storm
fuente
1
Antes de PHP 7, get_object_vars()en un stdClassresultado de lanzar una matriz a un objeto, se obtendrá una matriz vacía. Lanzar la stdClassinstancia a una matriz, por otro lado, funciona en todas partes.
Xedin Desconocido
Funciona para mí en PHP 5.6.30
R. Daumann
8

El objeto no tiene 30 propiedades. Tiene uno, que es una matriz que tiene 30 elementos. Necesita la cantidad de elementos en esa matriz.

Rob Drimmie
fuente
1
Mirando un poco más los datos, podría ser mejor usar el parámetro $ assoc con json_encode, que lo convierte en una matriz. Esa propiedad que está obteniendo se nombra de la marca de tiempo, que será difícil acceder regularmente. Como una matriz, podría contar ($ tendencias [0]);
Rob Drimmie
Probablemente debería haber dado un mejor ejemplo. El objeto stdClass tiene más que solo el que di en el ejemplo. Tiene 32, cada uno con una matriz con 20 elementos.
hellopat el
5

Aquí no hay nada de malo en contar (), "tendencias" es la única clave que se cuenta en este caso, puede intentar hacer:

count($obj->trends);

O:

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

O tal vez incluso haciendo:

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

Solo usa esto

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

La variable $ies el número de claves.

Arash Younesi
fuente
0

Cuenta Arrya u objeto normal

count($object_or_array); 

Cuenta arrya u objeto multidimensional

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

count()La función funciona con una matriz. Pero si desea contar la longitud del objeto, puede usar este método.

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