2009-08-22 8 views
81

J'ai un objet stdClass créé à partir de json_decode qui ne retournera pas le bon nombre lorsque j'exécuterai la fonction count ($ obj). L'objet a 30 propriétés, mais le retour sur la fonction count() est dit 1.PHP: Compter un objet stdClass

Des idées?

Voici un exemple de l'un des objets. (Je demande les informations sur les tendances quotidiennes de Twitter). Si cet objet avait plus d'une propriété, le nombre (obj $) serait égal à 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

Pourriez-vous préciser votre exemple? Comme vous l'avez posté, il a une propriété '2009-08-21 11: 05', étant un tableau avec 20 entrées, donc count ($ trends) retournerait légitimement 1. –

+1

Comme [Steven a souligné] (http:// stackoverflow.com/questions/1314745/php-count-an-stdclass-object/1314754 # 1314754), l'objet est de type stdClass, qui n'implémente pas l'interface Countable, donc count () retournera toujours 1. –

+0

Hopel, vous avez parfaitement raison. Si je lance l'objet dans un tableau, il renvoie le bon nombre! Excellent. – hellopat

Répondre

168

Le problème est que le nombre est destiné à compter les index dans un tableau, pas les propriétés d'un objet, (à moins que c'est un objet personnalisé qui implémente l'interface Countable). Essayez de lancer l'objet, comme ci-dessous, comme un tableau et voir si cela aide. Le simple fait de lancer un objet en tant que tableau ne fonctionnera pas toujours, mais étant un simple objet stdClass, le travail devrait être fait ici.

+8

être que les propriétés privées apparaîtront dans le tableau résultant, ce qui est vraiment inattendu. –

+9

Bien que cette méthode fonctionne, je ne l'utiliserais pas pour l'implémentation car les futures versions de PHP pourraient provoquer la rupture de ce code, je préfère de loin la réponse d'Alan Strom. – ars265

9

L'objet n'a pas 30 propriétés. Il en a un, qui est un tableau qui a 30 éléments. Vous avez besoin du nombre d'éléments dans ce tableau.

+1

Poussant un peu plus sur les données, il peut être préférable d'utiliser le paramètre $ assoc avec json_encode, qui le convertit en tableau. Cette propriété que vous obtenez est nommée à partir de l'horodatage qui va être une bonne douleur pour accéder régulièrement. En tant que tableau, vous pouvez simplement compter ($ trends [0]); –

+0

J'aurais probablement dû donner un meilleur exemple. L'objet stdClass a plus que celui que j'ai donné dans l'exemple. Il a 32, chacun contenant un tableau avec 20 éléments. – hellopat

4

Il n'y a rien de mal à count() ici, "tendances" est la seule clé qui est compté dans ce cas, vous pouvez essayer de faire:

count($obj->trends); 

Ou:

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

ou peut-être même faire:

count($obj, COUNT_RECURSIVE); 
85

La fonction de comptage est destiné à être utilisé sur

  1. tableaux
  2. objets qui sont issus de classes qui mettent en œuvre l'interface dénombrable

Un stdClass est ni de ceux-ci. Le plus facile/moyen le plus rapide à accomplir ce que vous êtes après est

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

Cette fonction utilise get_object_vars de PHP, qui renvoie les propriétés d'un objet comme un tableau. Vous pouvez ensuite utiliser ce tableau avec la fonction count de PHP.

+0

Avant PHP 7, 'get_object_vars()' sur un 'stdClass' qui résultait du lancement d'un tableau sur un objet produira un tableau vide. D'autre part, lancer l'instance 'stdClass' sur array, fonctionne partout. – XedinUnknown

-2

count() Fonctionne avec array. Mais si vous voulez compter la longueur de l'objet, vous pouvez utiliser cette méthode.

$total = $obj->length; 
0

utiliser juste ce

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

la $i variables est le nombre de touches.

Questions connexes