PHP: conta un oggetto stdClass


121

Ho un oggetto stdClass creato da json_decode che non restituirà il numero corretto quando eseguo la funzione count ($ obj). L'oggetto ha 30 proprietà, ma il ritorno sulla funzione count () è 1.

Qualche idea?

Di seguito è riportato un esempio di uno degli oggetti. (Chiedo le informazioni sulle tendenze giornaliere da Twitter). Se questo oggetto avesse più di una proprietà, il conteggio ($ obj) sarebbe uguale 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
Puoi chiarire il tuo esempio? Come l'hai pubblicato, ha una proprietà 2009-08-21 11:05, essendo un array con 20 voci, quindi count ($ trends) restituirà giustamente 1.
Henrik Opel

1
Come ha sottolineato Steven , l'oggetto è di tipo stdClass, che non implementa l'interfaccia Countable, quindi count (<oggetto stdClass>) restituirà sempre 1.
Henrik Opel

Hopel, hai esattamente ragione. Se eseguo il cast dell'oggetto su un array, restituisce il numero corretto! Eccellente.
hellopat

potresti voler accettare una risposta. soprattutto visto che hai scritto nel commento che la prima risposta data funziona per te.
Andresch Serj

Risposte:


253

Il problema è che count ha lo scopo di contare gli indici in un array, non le proprietà di un oggetto (a meno che non si tratti di un oggetto personalizzato che implementa l'interfaccia Countable). Prova a lanciare l'oggetto, come sotto, come array e vedi se questo aiuta.

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

Il semplice cast di un oggetto come array non funzionerà sempre, ma essendo un semplice oggetto stdClass dovrebbe portare a termine il lavoro qui.


9
attenzione che le proprietà private appariranno nella matrice risultante, il che è davvero inaspettato.
Hugo Mota,

14
Sebbene questo metodo funzioni, non lo userei per l'implementazione perché le versioni future di PHP potrebbero causare la rottura di questo codice, preferisco di gran lunga la risposta di Alan Strom.
ars265

109

La funzione di conteggio è pensata per essere utilizzata su

  1. Array
  2. Oggetti derivati ​​da classi che implementano l'interfaccia numerabile

Uno stdClass non è nessuno di questi. Il modo più semplice / veloce per realizzare ciò che stai cercando è

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

Questo utilizza la funzione get_object_vars di PHP , che restituirà le proprietà di un oggetto come un array. È quindi possibile utilizzare questo array con la funzione count di PHP.


1
Prima di PHP 7, get_object_vars()su un stdClassrisultato derivante dal casting di un array su un oggetto, verrà prodotto un array vuoto. Il cast stdClassdell'istanza nell'array, d'altra parte, funziona ovunque.
XedinUnknown

Funziona per me su PHP 5.6.30
R. Daumann

8

L'oggetto non ha 30 proprietà. Ne ha uno, che è un array che ha 30 elementi. Hai bisogno del numero di elementi in quell'array.


1
Esaminando i dati un po 'di più, potrebbe essere meglio usare $ assoc param con json_encode, che lo converte in un array. Quella proprietà che stai ricevendo prende il nome dal timestamp che sarà un problema a cui accedere regolarmente. Come array potresti semplicemente contare ($ trends [0]);
Rob Drimmie

Probabilmente avrei dovuto dare un esempio migliore. L'oggetto stdClass ha più di quello che ho fornito nell'esempio. Ne ha 32, ciascuno contenente un array con 20 elementi.
hellopat

5

Non c'è niente di sbagliato in count () qui, "trends" è l'unica chiave che viene contata in questo caso, puoi provare a fare:

count($obj->trends);

O:

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

O forse anche facendo:

count($obj, COUNT_RECURSIVE);

1

Usa questo

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

la variabile $iè il numero di chiavi.


0

Conta normale arrya o oggetto

count($object_or_array); 

Contare arrya o oggetto multidimensionale

count($object_or_array, 1); // 1 for  multidimensional array count, 0 for Default

-4

count()funzione funziona con array. Ma se vuoi contare la lunghezza di un oggetto, puoi usare questo metodo.

$total = $obj->length;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.