PHP: compter un objet stdClass

121

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

Des idées?

Voici un exemple de l'un des objets. (Je demande les informations de tendance quotidiennes à 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
                    )

            )
     )
hellopat
la source
3
Pouvez-vous clarifier 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) renverrait à juste titre 1.
Henrik Opel
1
Comme Steven l'a souligné , l'objet est de type stdClass, qui n'implémente pas l'interface Countable, donc count (<objet stdClass>) retournera toujours 1.
Henrik Opel
Hopel, vous avez tout à fait raison. Si je lance l'objet dans un tableau, il renvoie le nombre correct! Excellent.
hellopat
vous voudrez peut-être accepter une réponse. surtout que vous avez écrit dans le commentaire que la première réponse donnée fonctionne pour vous.
Andresch Serj

Réponses:

253

Le problème est que count est destiné à compter les index dans un tableau, pas les propriétés d'un objet (à moins qu'il ne s'agisse d'un objet personnalisé qui implémente l'interface Countable). Essayez de lancer l'objet, comme ci-dessous, sous forme de tableau et voyez si cela aide.

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

Le simple fait de convertir un objet en tableau ne fonctionnera pas toujours, mais étant un simple objet stdClass, il devrait faire le travail ici.

Steven Surowiec
la source
9
sachez que les propriétés privées apparaîtront dans le tableau résultant, ce qui est vraiment inattendu.
Hugo Mota
14
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
109

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

  1. Tableaux
  2. Objets dérivés de classes qui implémentent l'interface dénombrable

Un stdClass n'est ni l'un ni l'autre. Le moyen le plus simple / le plus rapide d'accomplir ce que vous recherchez est

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

Cela utilise la fonction get_object_vars de PHP , qui retournera les propriétés d'un objet sous forme de tableau. Vous pouvez ensuite utiliser ce tableau avec la fonction de comptage de PHP.

Alan Storm
la source
1
Avant PHP 7, get_object_vars()sur un stdClassqui résultait de la conversion d'un tableau en un objet produira un tableau vide. Le cast de l' stdClassinstance en tableau, en revanche, fonctionne partout.
XedinUnknown
Fonctionne pour moi sur PHP 5.6.30
R. Daumann
8

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

Rob Drimmie
la source
1
En poussant un peu plus les données, il serait 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, ce qui sera un bon moyen d'y accéder régulièrement. En tant que tableau, vous pouvez simplement faire count ($ trends [0]);
Rob Drimmie
J'aurais probablement dû donner un meilleur exemple. L'objet stdClass a plus que celui que j'ai donné dans l'exemple. Il en a 32, chacun contenant un tableau de 20 éléments.
hellopat
5

Il n'y a rien de mal avec count () ici, "tendances" est la seule clé qui est comptée 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);
Alix Axel
la source
1

Utilisez simplement ceci

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

la variable $iest le nombre de clés.

Arash Younesi
la source
0

Count Normal arrya ou objet

count($object_or_array); 

Compter les arries ou objets multidimensionnels

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

count()La fonction fonctionne avec un tableau. Mais si vous souhaitez compter la longueur de l'objet, vous pouvez utiliser cette méthode.

$total = $obj->length;
WaQaR Ali
la source