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

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

какие идеи?

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


проблема в том, что 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 () здесь, "тенденции" - единственный ключ, который подсчитывается в этом случае, вы можете попробовать сделать:

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;