PHP: Count a stdClass object
Asked Answered
A

9

153

I have a stdClass object created from json_decode that won't return the right number when I run the count($obj) function. The object has 30 properties, but the return on the count() function is say 1.

Any ideas?

Below is an example of one of the objects. (I'm requesting the daily trend information from Twitter). If this object had more than one property, the count($obj) would equal 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
                    )

            )
     )
Azure answered 22/8, 2009 at 0:22 Comment(4)
Could you clarify your example? As you posted it, it is has one property 2009-08-21 11:05, being an array with 20 entries, so count($trends) would rightfully return 1.Blizzard
As Steven pointed out, the Object is of type stdClass, which does not implement the Countable interface, thus count(<stdClass object>) will always return 1.Blizzard
Hopel, you're exactly right. If I cast the object to an array it returns the correct number! Excellent.Azure
you might want to accept an answer. especially geiven that you wrote in the comment that the first given answer works for you.Jeffjeffcoat
R
328

The problem is that count is intended to count the indexes in an array, not the properties on an object, (unless it's a custom object that implements the Countable interface). Try casting the object, like below, as an array and seeing if that helps.

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

Simply casting an object as an array won't always work but being a simple stdClass object it should get the job done here.

Regular answered 22/8, 2009 at 0:26 Comment(2)
be ware that private properties will appear in the resultant array, wich is really unexpected.Cheroot
While this method works, I would not use it for implementation because future versions of PHP could cause this code to break, I much prefer Alan Strom's answer.Cannady
H
133

The count function is meant to be used on

  1. Arrays
  2. Objects that are derived from classes that implement the countable interface

A stdClass is neither of these. The easier/quickest way to accomplish what you're after is

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

This uses PHP's get_object_vars function, which will return the properties of an object as an array. You can then use this array with PHP's count function.

Hive answered 22/8, 2009 at 1:5 Comment(2)
Before PHP 7, get_object_vars() on an stdClass that resulted from casting an array to an object will yield an empty array. Casting the stdClass instance to array, on the other hand, works everywhere.Helvellyn
Works for me on PHP 5.6.30Opulence
C
9

The object doesn't have 30 properties. It has one, which is an array that has 30 elements. You need the number of elements in that array.

Cephalometer answered 22/8, 2009 at 0:27 Comment(2)
Poking at the data a little more, it might be better to use the $assoc param with json_encode, which converts it to an array. That property you're getting is named from the timestamp which is going to be a right pain to access regularly. As an array you could just do count( $trends[0] );Cephalometer
I probably should have given a better example. The stdClass object has more than just the one I gave in the example. It has 32, each containing an array with 20 elements.Azure
P
5

There is nothing wrong with count() here, "trends" is the only key that is being counted in this case, you can try doing:

count($obj->trends);

Or:

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

Or maybe even doing:

count($obj, COUNT_RECURSIVE);
Parallelepiped answered 22/8, 2009 at 0:31 Comment(0)
D
1

Just use this

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

the variable $i is number of keys.

Dortch answered 1/10, 2017 at 1:12 Comment(0)
B
1

You can use ArrayIterator for that purpose.

(new \ArrayIterator($obj))->count()
Butylene answered 5/3, 2022 at 21:30 Comment(0)
M
0

you can use sizeof() function to get the length of any object in PHP!

Mellicent answered 21/2, 2023 at 11:27 Comment(1)
It's just an alias of count(): php.net/sizeofDelicatessen
G
-1

Count Normal arrya or object

count($object_or_array); 

Count multidimensional arrya or object

count($object_or_array, 1); // 1 for  multidimensional array count, 0 for Default
Glycoprotein answered 29/2, 2020 at 10:19 Comment(0)
P
-5

count() function works with array. But if you want to count object's length then you can use this method.

$total = $obj->length;
Patrilocal answered 23/12, 2015 at 5:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.