PHP: подсчитать объект stdClass

121

У меня есть объект stdClass, созданный из json_decode, который не будет возвращать правильное число, когда я запускаю функцию count ($ obj). Объект имеет 30 свойств, но функция count () возвращает, скажем, 1.

Любые идеи?

Ниже приведен пример одного из объектов. (Я запрашиваю ежедневную информацию о тенденциях в Твиттере). Если бы у этого объекта было более одного свойства, счетчик ($ 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
                    )

            )
     )
hellopat
источник
3
Не могли бы вы пояснить свой пример? Как вы опубликовали, у него есть одно свойство 2009-08-21 11:05- массив с 20 записями, поэтому count ($ trend) по праву вернет 1.
Хенрик Опель,
1
Как указал Стивен , объект имеет тип stdClass, который не реализует интерфейс Countable, поэтому count (<stdClass object>) всегда будет возвращать 1.
Хенрик Опель,
Надеюсь, ты совершенно прав. Если я приведу объект к массиву, он вернет правильный номер! Превосходно.
hellopat
вы можете принять ответ. особенно учитывая то, что вы написали в комментарии, что первый данный ответ работает для вас.
Андреш Серж

Ответы:

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));

Здесь используется функция PHP get_object_vars , которая возвращает свойства объекта в виде массива. Затем вы можете использовать этот массив с функцией подсчета PHP.

Алан Сторм
источник
1
До PHP 7 get_object_vars()в stdClassрезультате преобразования массива в объект был получен пустой массив. С stdClassдругой стороны, приведение экземпляра к массиву работает везде.
XedinUnknown
Работает у меня на PHP 5.6.30
Р. Дауман
8

У объекта нет 30 свойств. У него есть один, который представляет собой массив из 30 элементов. Вам нужно количество элементов в этом массиве.

Роб Дримми
источник
1
Попробовав немного больше, было бы лучше использовать параметр $ assoc с json_encode, который преобразует его в массив. Это свойство, которое вы получаете, названо по временной метке, к которой будет сложно получить регулярный доступ. В качестве массива вы можете просто выполнить count ($ Trends [0]);
Роб Дримми,
Я, наверное, должен был привести лучший пример. Объект stdClass имеет больше, чем только тот, который я привел в примере. Он состоит из 32 элементов, каждый из которых содержит массив из 20 элементов.
hellopat
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;
WaQaR Али
источник