PHP: stdClass nesnesini sayın


121

Count ($ obj) işlevini çalıştırdığımda doğru sayıyı döndürmeyen json_decode'dan oluşturulmuş bir stdClass nesnem var. Nesnenin 30 özelliği vardır, ancak count () işlevinin getirisi 1'dir.

Herhangi bir fikir?

Aşağıda nesnelerden birine bir örnek verilmiştir. (Twitter'dan günlük trend bilgilerini istiyorum). Bu nesnenin birden fazla özelliği varsa, sayı ($ obj) 1'e eşit olur.

[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
Örneğinizi açıklar mısınız? Yayınladığınız gibi, 2009-08-21 11:0520 girişli bir dizi olan tek bir mülkü var , bu nedenle count ($ trendler) haklı olarak 1 döndürür.
Henrik Opel

1
Steven'ın belirttiği gibi , Object, Countable arabirimini uygulamayan stdClass türündedir, bu nedenle count (<stdClass nesnesi>) her zaman 1 döndürür.
Henrik Opel

Hopel, kesinlikle haklısın. Nesneyi bir diziye atarsam, doğru sayıyı döndürür! Mükemmel.
hellopat

bir cevabı kabul etmek isteyebilirsin. özellikle ilk verilen cevabın sizin için çalıştığını yorumda yazdığınız için.
Andresch Serj

Yanıtlar:


253

Sorun, count'un bir nesnedeki özellikleri değil dizideki dizinleri saymasıdır (Sayılabilir arabirimini uygulayan özel bir nesne olmadığı sürece). Aşağıdaki gibi nesneyi bir dizi olarak yayınlamayı ve bunun yardımcı olup olmadığını görmeyi deneyin.

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

Basitçe bir nesneyi bir dizi olarak dönüştürmek her zaman işe yaramayacaktır, ancak basit bir stdClass nesnesi olduğu için işi burada yapmalıdır.


9
özel özelliklerin ortaya çıkan dizide görüneceği, ki bu gerçekten beklenmedik bir durumdur.
Hugo Mota

14
Bu yöntem işe yarasa da, PHP'nin gelecekteki sürümleri bu kodun bozulmasına neden olabileceği için uygulama için kullanmam, Alan Strom'un cevabını daha çok tercih ederim.
ars265

109

Sayma işlevi,

  1. Diziler
  2. Sayılabilir arabirimi uygulayan sınıflardan türetilen nesneler

Bir stdClass bunların hiçbiri değildir. Peşinde olduğunuz şeyi başarmanın daha kolay / en hızlı yolu

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

Bu , bir nesnenin özelliklerini bir dizi olarak döndüren PHP'nin get_object_vars işlevini kullanır . Daha sonra bu diziyi PHP'nin sayma işlevi ile kullanabilirsiniz.


1
PHP 7 önce, get_object_vars()bir on stdClassboş bir dizi elde edecek bir nesne için bir dizi döküm kaynaklandığı. Döküm stdClassdiziye örneği, diğer taraftan, her yerde çalışır.
XedinUnknown

Benim için çalışıyor PHP 5.6.30
R.Daumann

8

Nesnenin 30 özelliği yok. Biri var, bu da 30 elemanlı bir dizi. Bu dizideki elemanların sayısına ihtiyacınız var.


1
Verileri biraz daha karıştırarak, $ assoc parametresini json_encode ile kullanmak daha iyi olabilir, bu onu bir diziye dönüştürür. Aldığınız mülke, düzenli olarak erişmek için doğru bir acı olacak olan zaman damgasından adı verilir. Bir dizi olarak sayabilirsiniz ($ trendler [0]);
Rob Drimmie

Muhtemelen daha iyi bir örnek vermeliydim. StdClass nesnesi, örnekte verdiğimden daha fazlasına sahip. Her biri 20 elemanlı bir dizi içeren 32'ye sahiptir.
hellopat

5

Burada count () ile ilgili yanlış bir şey yok, "trendler" bu durumda sayılan tek anahtardır, şunu yapmayı deneyebilirsiniz:

count($obj->trends);

Veya:

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

Ya da belki yapıyor:

count($obj, COUNT_RECURSIVE);

1

Sadece bunu kullan

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

değişken $ianahtar sayısıdır.


0

Normal arya veya nesneyi say

count($object_or_array); 

Çok boyutlu arya veya nesneyi sayın

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

-4

count()fonksiyon dizi ile çalışır. Ancak nesnenin uzunluğunu saymak istiyorsanız bu yöntemi kullanabilirsiniz.

$total = $obj->length;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.