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
                    )

            )
     )

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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.