Подтвердить что ты не робот

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

У меня есть объект 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
                    )

            )
     )
4b9b3361

Ответ 1

Проблема заключается в том, что подсчет предназначен для подсчета индексов в массиве, а не для свойств объекта (если это не пользовательский объект, который реализует интерфейс Countable). Попробуйте использовать объект, как показано ниже, как массив и посмотреть, помогает ли это.

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

Простое литье объекта в виде массива не всегда будет работать, но, будучи простым объектом stdClass, он должен выполнить эту работу здесь.

Ответ 2

Функция count предназначена для использования на

  • Массивы
  • Объекты, производные от классов, реализующих счетный интерфейс

Нет. stdClass не является ни одним из них. Более простой/быстрый способ выполнить то, что вам нужно, -

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

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

Ответ 3

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

Ответ 4

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

count($obj->trends);

Или:

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

Или, возможно, даже делать:

count($obj, COUNT_RECURSIVE);

Ответ 5

Просто используйте этот

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

переменная $i - это количество ключей.

Ответ 6

Функция

count() работает с массивом. Но если вы хотите подсчитать длину объекта, вы можете использовать этот метод.

$total = $obj->length;