PHP:计算一个stdClass对象


121

我有一个从json_decode创建的stdClass对象,当我运行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
                    )

            )
     )

3
你能澄清你的例子吗?当你的贴吧,它是有一个属性2009-08-21 11:05,是与20个条目的数组,这样算($趋势)将理所当然地返回1
亨里克·欧宝

1
正如史蒂芬指出,对象的类型是stdClass的,它不实现可数的接口,从而计数(<stdClass的对象>)将始终返回1
的Henrik欧宝

希望,你是完全正确的。如果我将对象转换为数组,它将返回正确的数字!优秀的。
hellopat

您可能想接受答案。尤其是您在评论中写道的geiven,第一个给出的答案对您有效。
Andresch Serj

Answers:


252

问题在于count的目的是对数组中的索引进行计数,而不是对对象的属性进行计数(除非它是实现Countable接口的自定义对象)。尝试将对象(如下所示)转换为数组,看看是否有帮助。

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

简单地将对象转换为数组并不总是可行,但是作为一个简单的stdClass对象,它应该可以在这里完成工作。


9
注意私有属性将出现在结果数组中,这确实是意外的。
雨果·莫塔

14
尽管此方法有效,但我不会将其用于实现,因为将来版本的PHP可能会导致此代码中断,我更喜欢Alan Strom的回答。
ars265

109

计数功能旨在用于

  1. 数组
  2. 从实现可数接口的类派生的对象

stdClass都不是这些。完成所追求目标的最简单/最快捷的方法是

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

这使用PHP的get_object_vars函数,该函数将对象的属性作为数组返回。然后,可以将此数组与PHP的count函数一起使用。


1
在PHP 7之前get_object_vars()的版本中stdClass,将数组强制转换为对象会产生一个空数组。stdClass另一方面,将实例转换为数组可在任何地方使用。
XedinUnknown

适用于我的PHP 5.6.30
R. Daumann

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);



-4

count()函数与数组一起使用。但是,如果要计算对象的长度,则可以使用此方法。

$total = $obj->length;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.