PHP: contar um objeto stdClass

121

Eu tenho um objeto stdClass criado a partir de json_decode que não retornará o número certo quando executar a função count ($ obj). O objeto possui 30 propriedades, mas o retorno da função count () é 1.

Alguma ideia?

Abaixo está um exemplo de um dos objetos. (Estou solicitando as informações de tendências diárias do Twitter). Se esse objeto tivesse mais de uma propriedade, a contagem ($ obj) seria 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
                    )

            )
     )
hellopat
fonte
3
Você poderia esclarecer seu exemplo? Como você postou, é tem uma propriedade 2009-08-21 11:05, sendo um array com 20 entradas, então count ($ tendências) seria justamente retornar 1.
Henrik Opel
1
Como Steven apontou , o objeto é do tipo stdClass, que não implementa a interface Countable, assim, contar (<stdClass object>) sempre retornará 1.
Henrik Opel
Hopel, você está exatamente certo. Se eu converter o objeto em uma matriz, ele retornará o número correto! Excelente.
hellopat
você pode querer aceitar uma resposta. especialmente porque você escreveu no comentário que a primeira resposta dada funciona para você.
Andresch Serj

Respostas:

252

O problema é que o objetivo da contagem é contar os índices em uma matriz, não as propriedades em um objeto (a menos que seja um objeto personalizado que implemente a interface Contável). Tente converter o objeto, como abaixo, como uma matriz e veja se isso ajuda.

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

Simplesmente converter um objeto como uma matriz nem sempre funciona, mas como um objeto stdClass simples, ele deve fazer o trabalho aqui.

Steven Surowiec
fonte
9
tenha em atenção que as propriedades privadas aparecerão na matriz resultante, o que é realmente inesperado.
Hugo Mota
14
Embora esse método funcione, eu não o usaria para implementação, porque versões futuras do PHP poderiam causar a quebra desse código, prefiro a resposta de Alan Strom.
Ars265
109

A função de contagem deve ser usada em

  1. Matrizes
  2. Objetos derivados de classes que implementam a interface contável

Um stdClass não é um desses. A maneira mais fácil / rápida de realizar o que você procura é

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

Isso usa a função get_object_vars do PHP , que retornará as propriedades de um objeto como uma matriz. Você pode usar esse array com a função count do PHP.

Alan Storm
fonte
1
Antes do PHP 7, get_object_vars()em um stdClassresultado da conversão de uma matriz para um objeto, a matriz era vazia. A transmissão da stdClassinstância para matriz, por outro lado, funciona em qualquer lugar.
precisa saber é o seguinte
Funciona para mim no PHP 5.6.30
R. Daumann
8

O objeto não possui 30 propriedades. Ele tem um, que é uma matriz que possui 30 elementos. Você precisa do número de elementos nessa matriz.

Rob Drimmie
fonte
1
Observando um pouco mais os dados, pode ser melhor usar o parâmetro $ assoc com json_encode, que o converte em uma matriz. Essa propriedade que você está recebendo é nomeada no registro de data e hora, que será uma dor certa para acessar regularmente. Como uma matriz, você pode simplesmente contar ($ trends [0]);
Rob Drimmie 22/08/09
Eu provavelmente deveria ter dado um exemplo melhor. O objeto stdClass tem mais do que apenas o que eu dei no exemplo. Possui 32, cada um contendo uma matriz com 20 elementos.
hellopat
5

Não há nada errado com count () aqui, "tendências" é a única chave que está sendo contada nesse caso, você pode tentar:

count($obj->trends);

Ou:

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

Ou talvez até fazendo:

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

Basta usar isso

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

a variável $ié o número de chaves.

Arash Younesi
fonte
0

Contagem Arrya normal ou objeto

count($object_or_array); 

Contar arrya ou objeto multidimensional

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

count()A função funciona com array. Mas se você quiser contar o comprimento do objeto, poderá usar esse método.

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