PHP: Hitung objek stdClass

121

Saya memiliki objek stdClass yang dibuat dari json_decode yang tidak akan mengembalikan angka yang benar ketika saya menjalankan fungsi count ($ obj). Objek memiliki 30 properti, tetapi pengembalian fungsi count () katakanlah 1.

Ada ide?

Di bawah ini adalah contoh salah satu objek. (Saya meminta informasi tren harian dari Twitter). Jika objek ini memiliki lebih dari satu properti, count ($ obj) akan sama dengan 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
sumber
3
Bisakah Anda menjelaskan contoh Anda? Saat Anda mempostingnya, ini memiliki satu properti 2009-08-21 11:05, berupa array dengan 20 entri, jadi count ($ tren) berhak mengembalikan 1.
Henrik Opel
1
Seperti yang ditunjukkan Steven , Object bertipe stdClass, yang tidak mengimplementasikan antarmuka Countable, sehingga count (<stdClass object>) akan selalu mengembalikan 1.
Henrik Opel
Hopel, kamu benar sekali. Jika saya melemparkan objek ke array, ia mengembalikan nomor yang benar! Luar biasa.
hellopat
Anda mungkin ingin menerima jawaban. terutama jika Anda menulis di komentar bahwa jawaban pertama yang diberikan bekerja untuk Anda.
Andresch Serj

Jawaban:

253

Masalahnya adalah bahwa hitungan dimaksudkan untuk menghitung indeks dalam larik, bukan properti pada objek, (kecuali itu adalah objek khusus yang mengimplementasikan antarmuka Countable). Cobalah mentransmisikan objek, seperti di bawah ini, sebagai array dan lihat apakah itu membantu.

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

Cukup mentransmisikan objek sebagai array tidak akan selalu berfungsi tetapi sebagai objek stdClass sederhana, tugas tersebut harus diselesaikan di sini.

Steven Surowiec
sumber
9
Perhatikan bahwa properti pribadi akan muncul dalam larik yang dihasilkan, yang benar-benar tidak terduga.
Hugo Mota
14
Sementara metode ini berfungsi, saya tidak akan menggunakannya untuk implementasi karena versi PHP di masa depan dapat menyebabkan kode ini rusak, saya lebih suka jawaban Alan Strom.
ars265
109

Fungsi hitungan dimaksudkan untuk digunakan pada

  1. Array
  2. Objek yang diturunkan dari kelas yang mengimplementasikan antarmuka yang dapat dihitung

StdClass bukan keduanya. Cara termudah / tercepat untuk mencapai apa yang Anda cari adalah

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

Ini menggunakan fungsi get_object_vars PHP , yang akan mengembalikan properti objek sebagai array. Anda kemudian dapat menggunakan array ini dengan fungsi count PHP.

Alan Storm
sumber
1
Sebelum PHP 7, get_object_vars()hasil stdClasscasting array ke objek akan menghasilkan array kosong. stdClassSebaliknya, mentransmisikan instance ke array dapat berfungsi di mana saja.
XedinTak Diketahui
Bekerja untuk saya pada PHP 5.6.30
R. Daumann
8

Objek tidak memiliki 30 properti. Ini memiliki satu, yaitu array yang memiliki 30 elemen. Anda membutuhkan jumlah elemen dalam larik itu.

Rob Drimmie
sumber
1
Melihat data lebih banyak, mungkin lebih baik menggunakan parameter $ assoc dengan json_encode, yang mengubahnya menjadi sebuah array. Properti yang Anda dapatkan dinamai dari stempel waktu yang akan sangat merepotkan untuk diakses secara teratur. Sebagai sebuah array Anda bisa menghitung ($ trend [0]);
Rob Drimmie
Saya mungkin harus memberikan contoh yang lebih baik. Objek stdClass memiliki lebih dari sekedar yang saya berikan dalam contoh. Ini memiliki 32, masing-masing berisi array dengan 20 elemen.
hellopat
5

Tidak ada yang salah dengan count () di sini, "tren" adalah satu-satunya kunci yang dihitung dalam kasus ini, Anda dapat mencoba melakukan:

count($obj->trends);

Atau:

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

Atau bahkan mungkin melakukan:

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

Gunakan ini

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

variabelnya $iadalah jumlah kunci.

Arash Younesi
sumber
0

Hitung arrya atau objek normal

count($object_or_array); 

Hitung arya atau objek multidimensi

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

count()fungsi bekerja dengan array. Namun jika Anda ingin menghitung panjang benda maka Anda bisa menggunakan cara ini.

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