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.