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
                    )

            )
     )
6 89

6 ответов:

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

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

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

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

  1. массивы
  2. объекты, производные от классов, реализующих счетный интерфейс

stdClass не является ни тем, ни другим. Самый простой / быстрый способ выполнить то, что вы после этого

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

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

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

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

count($obj->trends);

или:

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

или, может быть, даже делать:

count($obj, COUNT_RECURSIVE);

просто использовать

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

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

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

$total = $obj->length;