PHP: Đếm một đối tượng stdClass


121

Tôi có một đối tượng stdClass được tạo từ json_decode sẽ không trả lại đúng số khi tôi chạy hàm count ($ obj). Đối tượng có 30 thuộc tính, nhưng giá trị trả về trên hàm count () là 1.

Có ý kiến ​​gì không?

Dưới đây là một ví dụ về một trong những đối tượng. (Tôi đang yêu cầu thông tin xu hướng hàng ngày từ Twitter). Nếu đối tượng này có nhiều thuộc tính, thì số lượng ($ obj) sẽ bằng 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
Bạn có thể làm rõ ví dụ của bạn? Như bạn đăng nó, nó là đã một tài sản 2009-08-21 11:05, là một mảng với 20 mục, vì vậy count ($ xu hướng) chính đáng sẽ trở về 1.
Henrik Opel

1
Như Steven đã chỉ ra , các đối tượng là loại stdClass, mà không thực hiện các giao diện đếm được, do đó đếm (<stdClass object>) sẽ luôn luôn trả 1.
Henrik Opel

Hopel, bạn chính xác. Nếu tôi ép đối tượng vào một mảng, nó sẽ trả về số chính xác! Thông minh.
hellopat

bạn có thể muốn chấp nhận một câu trả lời. đặc biệt là geiven mà bạn đã viết trong nhận xét rằng câu trả lời đưa ra đầu tiên phù hợp với bạn.
Andresch Serj

Câu trả lời:


253

Vấn đề là count nhằm đếm các chỉ mục trong một mảng, không phải các thuộc tính trên một đối tượng, (trừ khi đó là một đối tượng tùy chỉnh triển khai giao diện Countable). Hãy thử truyền đối tượng, như bên dưới, dưới dạng một mảng và xem điều đó có hữu ích không.

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

Đơn giản chỉ cần truyền một đối tượng dưới dạng một mảng không phải lúc nào cũng hoạt động nhưng là một đối tượng stdClass đơn giản, nó sẽ hoàn thành công việc ở đây.


9
là phần tử mà thuộc tính riêng sẽ xuất hiện trong mảng kết quả, điều này thực sự bất ngờ.
Hugo Mota

14
Trong khi phương pháp này hoạt động, tôi sẽ không sử dụng nó để thực hiện vì các phiên bản PHP trong tương lai có thể khiến mã này bị hỏng, tôi thích câu trả lời của Alan Strom hơn.
ars265

109

Hàm đếm được sử dụng trên

  1. Mảng
  2. Các đối tượng có nguồn gốc từ các lớp triển khai giao diện đếm được

Một stdClass không phải là những thứ này. Cách dễ dàng / nhanh nhất để đạt được những gì bạn đang theo đuổi là

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

Điều này sử dụng hàm get_object_vars của PHP, hàm này sẽ trả về các thuộc tính của một đối tượng dưới dạng một mảng. Sau đó, bạn có thể sử dụng mảng này với hàm đếm của PHP.


1
Trước PHP 7, get_object_vars()trên một stdClasskết quả từ việc truyền một mảng sang một đối tượng sẽ mang lại một mảng trống. Đúc các stdClassví dụ để mảng, mặt khác, làm việc ở khắp mọi nơi.
XedinUnknown

Công trình đối với tôi trên PHP 5.6.30
R. Daumann

8

Đối tượng không có 30 thuộc tính. Nó có một, là một mảng có 30 phần tử. Bạn cần số phần tử trong mảng đó.


1
Xem xét dữ liệu nhiều hơn một chút, có thể tốt hơn nếu sử dụng $ assoc param với json_encode, chuyển đổi nó thành một mảng. Thuộc tính mà bạn nhận được được đặt tên từ dấu thời gian, điều này sẽ rất khó để truy cập thường xuyên. Là một mảng bạn chỉ có thể đếm ($ xu hướng [0]);
Rob Drimmie

Tôi có lẽ nên đưa ra một ví dụ tốt hơn. Đối tượng stdClass không chỉ có một đối tượng mà tôi đã đưa ra trong ví dụ. Nó có 32, mỗi chứa một mảng có 20 phần tử.
hellopat

5

Không có gì sai với count () ở đây, "xu hướng" là khóa duy nhất được tính trong trường hợp này, bạn có thể thử làm:

count($obj->trends);

Hoặc là:

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

Hoặc thậm chí có thể làm:

count($obj, COUNT_RECURSIVE);

1

Chỉ cần sử dụng cái này

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

biến $ilà số khóa.


0

Đếm arrya bình thường hoặc đối tượng

count($object_or_array); 

Đếm arrya hoặc đối tượng đa chiều

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

-4

count()hàm hoạt động với mảng. Nhưng nếu bạn muốn đếm chiều dài của đối tượng thì bạn có thể sử dụng phương pháp này.

$total = $obj->length;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.