138

我有一个从 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
                    )

            )
     )
4

8 回答 8

297

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

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

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

于 2009-08-22T00:26:57.830 回答
120

计数功能旨在用于

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

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

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

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

于 2009-08-22T01:05:09.277 回答
9

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

于 2009-08-22T00:27:54.087 回答
5

这里的 count() 没有任何问题,“趋势”是在这种情况下被计算的唯一键,您可以尝试这样做:

count($obj->trends);

或者:

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

或者甚至可以做:

count($obj, COUNT_RECURSIVE);
于 2009-08-22T00:31:17.240 回答
1

就用这个

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

变量$i是键的数量。

于 2017-10-01T01:12:58.993 回答
0

您可以为此目的使用 ArrayIterator。

(new \ArrayIterator($obj))->count()
于 2022-03-05T21:30:22.260 回答
-1

计数正常的艾莉亚或对象

count($object_or_array); 

计算多维数组或对象

count($object_or_array, 1); // 1 for  multidimensional array count, 0 for Default
于 2020-02-29T10:19:20.343 回答
-5

count()函数适用于数组。但是如果你想计算对象的长度,那么你可以使用这个方法。

$total = $obj->length;
于 2015-12-23T05:11:28.220 回答