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
)
)
)
Ответы
Ответ 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;