PHP:计算stdClass对象的数量

152

我有一个通过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个条目的数组,所以count($trends)应该正确返回1。 - Henrik Opel
1
正如Steven指出,该对象是stdClass类型,它不实现可计数接口Countable,因此count(<stdClass object>)始终返回1。 - Henrik Opel
Hopel,你是完全正确的。 如果我将对象转换为数组,它将返回正确的数字!太好了。 - hellopat
你可能想要接受一个答案,特别是考虑到你在评论中写道第一个给出的答案对你有用。 - Andresch Serj
9个回答

325
问题在于count是用来计算数组索引数量的,而不是对象属性的数量(除非是实现了Countable接口的自定义对象)。尝试像下面这样将对象强制转换为数组,看看是否有帮助。
$total = count((array)$obj);

只是将对象强制转换为数组并不总是有效的,但作为一个简单的stdClass对象,在这里应该能完成工作。


9
请注意,私有属性将出现在结果数组中,这是非常意外的。 - Hugo Mota
15
虽然这种方法可行,但我不会在实施中使用它,因为未来的PHP版本可能会导致代码中断,我更喜欢Alan Strom的答案。 - ars265

133

count函数适用于:

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

stdClass不属于以上两者。要实现你想要的目标,最简单/最快的方法是

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

这里使用了PHP的get_object_vars函数,它会将一个对象的属性以数组形式返回。然后你可以使用这个数组和PHP的count函数。


1
在 PHP 7 之前,对一个从数组转换而来的 stdClass 使用 get_object_vars() 将会返回一个空数组。另一方面,将 stdClass 实例强制转换为数组则可以在任何情况下正常工作。 - XedinUnknown
在我的 PHP 5.6.30 上运行正常。 - R. Daumann

9

该对象没有30个属性。它只有一个数组,其中包含30个元素。您需要获取该数组中元素的数量。


1
再仔细研究数据后,使用json_encode的$assoc参数可能更好,它将其转换为数组。你正在获取的属性是根据时间戳命名的,这将会很难经常访问。作为一个数组,你只需要执行count($trends[0])即可。 - Rob Drimmie
我可能应该给出一个更好的例子。stdClass对象不仅具有我在示例中提供的属性,它有32个属性,每个属性都包含一个具有20个元素的数组。 - hellopat

5

这里使用count()没有问题,只有"trends"键被计数,在这种情况下,您可以尝试执行以下操作:

count($obj->trends);

或者:

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

也许甚至可以做到如下所示:
count($obj, COUNT_RECURSIVE);

1
只需使用此代码。
$i=0;
foreach ($object as $key =>$value)
{
$i++;
}

变量$i是键的数量。

1
您可以使用ArrayIterator来实现此目的。
(new \ArrayIterator($obj))->count()

0

你可以使用 sizeof() 函数来获取 PHP 中任何对象的长度!


它只是 count() 的别名:https://www.php.net/sizeof - biziclop

-1

计算普通数组或对象

count($object_or_array); 

计算多维数组或对象

count($object_or_array, 1); // 1 for  multidimensional array count, 0 for Default

-5

count()函数适用于数组。但是如果您想计算对象的长度,则可以使用此方法。

$total = $obj->length;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接