2009-08-22 26 views
81

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

¿Alguna idea?

A continuación se muestra un ejemplo de uno de los objetos. (Estoy solicitando la información de tendencias diarias de Twitter). Si este objeto tenía 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 
        ) 

      ) 
    ) 
+3

¿Podría aclarar su ejemplo? Como lo publicaste, tiene una propiedad '2009-08-21 11: 05', que es una matriz con 20 entradas, por lo que el recuento ($ tendencias) devolvería legítimamente 1. –

+1

Como [señaló Steven] (http://desbordamiento de pila.com/questions/1314745/php-count-an-stdclass-object/1314754 # 1314754), el objeto es de tipo stdClass, que no implementa la interfaz contable, por lo que count () siempre devolverá 1. –

+0

Hopel, tienes razón. Si lanzo el objeto a una matriz, ¡devuelve el número correcto! Excelente. – hellopat

Respuesta

168

El problema es que el recuento se pretende contar los índices en una matriz, no las propiedades de un objeto, (a menos es un objeto personalizado que implementa la interfaz Contable). Intenta lanzar el objeto, como a continuación, como una matriz y ver si eso ayuda.

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

simplemente echando un objeto como una matriz no siempre funciona, pero ser un simple objeto stdClass que debe hacer el trabajo aquí.

+8

asegúrese de que las propiedades privadas aparecerán en la matriz resultante, lo cual es realmente inesperado. –

+9

Si bien este método funciona, no lo usaría para la implementación porque las versiones futuras de PHP podrían hacer que este código se rompa, prefiero la respuesta de Alan Strom. – ars265

9

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

+1

Examinando 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 recibe recibe su nombre de la marca de tiempo, lo cual es un derecho para acceder regularmente. Como una matriz, puedes contar ($ trends [0]); –

+0

Probablemente debería haber dado un mejor ejemplo. El objeto stdClass tiene más que el que di en el ejemplo. Tiene 32, cada uno contiene una matriz con 20 elementos. – hellopat

4

No hay nada malo con count() aquí, "tendencias" es la única llave que se está contando en este caso, se puede tratar de hacer:

count($obj->trends); 

O:

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

o tal vez incluso haciendo:

count($obj, COUNT_RECURSIVE); 
85

La función de recuento está destinado a ser utilizado en

  1. Arrays
  2. Objetos que se derivan de las clases que implementan la interfaz contable

A stdClass no es ni de estos. La manera más fácil/más rápido para lograr lo que está buscando es

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

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

+0

Antes de PHP 7, 'get_object_vars()' en un 'stdClass' que resultó de convertir una matriz en un objeto generará una matriz vacía. Por otro lado, fundir la instancia 'stdClass' en una matriz funciona en todas partes. – XedinUnknown

-2

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

$total = $obj->length; 
0

sólo tiene que utilizar este

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

la variable $i es el número de llaves.

Cuestiones relacionadas