PHP: Порахуйте об'єкт stdClass


121

У мене є об’єкт stdClass, створений з json_decode, який не поверне потрібне число, коли я запускаю функцію count ($ obj). Об'єкт має 30 властивостей, але повернення функції count () - скажімо 1.

Будь-які ідеї?

Нижче наведено приклад одного з об’єктів. (Я запитую щоденну інформацію про тренд з Twitter). Якби у цього об’єкта було більше одного властивості, кількість ($ obj) дорівнювало б 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
Чи можете ви пояснити свій приклад? Опублікувавши це, у нього є одна властивість 2009-08-21 11:05- це масив з 20 записами, тому підрахунок ($ тенденції) справедливо повернеться 1.
Генрік Опель

1
Як зазначив Стівен , Об'єкт має тип stdClass, який не реалізує інтерфейс Countable, тому кількість (<stdClass об’єкт>) завжди повернеться 1.
Henrik Opel

Хопел, ти маєш абсолютно рацію. Якщо я кидаю об'єкт у масив, він повертає правильне число! Відмінно.
привіт

ви можете прийняти відповідь. особливо geiven, що ви написали в коментарі, що перша відповідь працює на вас.
Андреш Серж

Відповіді:


253

Проблема полягає в тому, що count призначений для підрахунку індексів у масиві, а не властивостей об’єкта (якщо це не власний об'єкт, який реалізує інтерфейс Countable). Спробуйте передати об’єкт, як нижче, як масив і побачити, чи це допомагає.

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

Просто передати об’єкт як масив не завжди буде працювати, але, будучи простим об’єктом stdClass, він повинен виконати роботу тут.


9
Потрібно мати на увазі, що приватні властивості з'являтимуться в масиві, що виникає, що насправді несподівано.
Хуго Мота

14
Хоча цей метод працює, я не використовував би його для реалізації, оскільки майбутні версії PHP можуть призвести до порушення цього коду, я більше віддаю перевагу відповіді Алана Стром.
ars265

109

Функція підрахунку призначена для використання

  1. Масиви
  2. Об'єкти, що походять від класів, що реалізують лічильний інтерфейс

А stdClass не є жодним із цих. Найпростіший / швидкий спосіб досягти того, що ви хочете

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

Для цього використовується функція get_object_vars PHP , яка поверне властивості об'єкта як масив. Потім ви можете використовувати цей масив за допомогою функції підрахунку PHP.


1
Перед PHP 7 get_object_vars()на тому, stdClassщо було результатом перекидання масиву на об'єкт, вийде порожній масив. stdClassЗ іншого боку, передача екземпляра до масиву працює скрізь.
XedinНевідомий

Працює для мене на PHP 5.6.30
R. Daumann

8

Об'єкт не має 30 властивостей. Він має один, який представляє собою масив, який містить 30 елементів. Вам потрібно кількість елементів у цьому масиві.


1
Подивившись на дані трохи більше, можливо, буде краще використовувати параметр $ assoc з json_encode, який перетворює їх у масив. Властивість, яку ви отримуєте, названа від часової позначки, яка буде регулярно отримувати біль. Як масив ви могли просто рахувати ($ тенденції [0]);
Роб Дріммі

Я, мабуть, мав би дати кращий приклад. Об'єкт stdClass має більше, ніж лише те, що я подав у прикладі. Він має 32, кожен містить масив з 20 елементами.
привіт

5

Тут немає нічого поганого в count (), "тенденції" - це єдиний ключ, який враховується в цьому випадку, ви можете спробувати зробити:

count($obj->trends);

Або:

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

А може, навіть роблю:

count($obj, COUNT_RECURSIVE);

1

Просто використовуйте це

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

змінна $i- кількість клавіш.


0

Порахуйте Звичайна аррія або об'єкт

count($object_or_array); 

Порахуйте багатовимірну аррію або об'єкт

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

-4

count()функція працює з масивом. Але якщо ви хочете порахувати довжину об'єкта, тоді ви можете скористатися цим методом.

$total = $obj->length;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.