PHP: นับวัตถุ stdClass


121

ฉันมีวัตถุ stdClass ที่สร้างจาก json_decode ซึ่งจะไม่ส่งคืนตัวเลขที่ถูกต้องเมื่อฉันเรียกใช้ฟังก์ชัน count ($ obj) วัตถุมีคุณสมบัติ 30 แต่ผลตอบแทนของฟังก์ชัน count () คือพูด 1

ความคิดใด ๆ ?

ด้านล่างนี้เป็นตัวอย่างของวัตถุอย่างใดอย่างหนึ่ง (ฉันขอข้อมูลเทรนด์รายวันจาก Twitter) ถ้าออบเจ็กต์นี้มีมากกว่าหนึ่งคุณสมบัติจำนวน ($ 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 อย่างถูกต้อง
Henrik Opel

1
ดังที่สตีเวนชี้ให้เห็นว่า Object เป็นประเภท stdClass ซึ่งไม่ได้ใช้อินเทอร์เฟซ Countable ดังนั้นการนับ (<stdClass object>) จะส่งกลับ 1 เสมอ
Henrik Opel

Hopel คุณพูดถูก ถ้าฉันโยนวัตถุไปยังอาร์เรย์มันจะส่งกลับตัวเลขที่ถูกต้อง! ยอดเยี่ยม
hellopat

คุณอาจต้องการยอมรับคำตอบ โดยเฉพาะอย่างยิ่ง geiven ที่คุณเขียนไว้ในความคิดเห็นว่าคำตอบแรกเหมาะกับคุณ
Andresch Serj

คำตอบ:


253

ปัญหาคือการนับมีไว้เพื่อนับดัชนีในอาร์เรย์ไม่ใช่คุณสมบัติของวัตถุ (เว้นแต่เป็นวัตถุที่กำหนดเองที่ใช้อินเทอร์เฟซ Countable) ลองแคสต์ออบเจ็กต์ดังต่อไปนี้เป็นอาร์เรย์และดูว่าช่วยได้หรือไม่

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

เพียงแค่แคสต์ออบเจ็กต์เป็นอาร์เรย์จะไม่ได้ผลเสมอไป แต่เป็นออบเจ็กต์ stdClass ธรรมดามันควรจะทำให้งานเสร็จที่นี่


9
เป็นเครื่องที่คุณสมบัติส่วนตัวจะปรากฏในอาร์เรย์ผลลัพธ์ซึ่งเป็นสิ่งที่คาดไม่ถึงจริงๆ
Hugo Mota

14
แม้ว่าวิธีนี้จะใช้ได้ผล แต่ฉันจะไม่ใช้มันเพื่อนำไปใช้งานเพราะ PHP เวอร์ชันอนาคตอาจทำให้โค้ดนี้พังฉันชอบคำตอบของ Alan Strom มากกว่า
ars265

109

ฟังก์ชันการนับมีไว้เพื่อใช้กับ

  1. อาร์เรย์
  2. อ็อบเจ็กต์ที่ได้มาจากคลาสที่ใช้อินเทอร์เฟซที่นับได้

stdClass ไม่ใช่สิ่งเหล่านี้ วิธีที่ง่ายและรวดเร็วที่สุดในการบรรลุสิ่งที่คุณต้องการคือ

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

สิ่งนี้ใช้ฟังก์ชันget_object_varsของ PHP ซึ่งจะส่งคืนคุณสมบัติของวัตถุเป็นอาร์เรย์ จากนั้นคุณสามารถใช้อาร์เรย์นี้กับฟังก์ชันนับของ PHP


1
ก่อน PHP 7 ซึ่งget_object_vars()เป็นstdClassผลมาจากการส่งอาร์เรย์ไปยังวัตถุจะให้อาร์เรย์ว่าง ในทางกลับกันการส่งstdClassอินสแตนซ์ไปยังอาร์เรย์ทำงานได้ทุกที่
XedinUnknown

ใช้งานได้กับ PHP 5.6.30
R. Daumann

8

วัตถุไม่มีคุณสมบัติ 30 มันมีหนึ่งอันซึ่งเป็นอาร์เรย์ที่มี 30 องค์ประกอบ คุณต้องการจำนวนองค์ประกอบในอาร์เรย์นั้น


1
เมื่อมองไปที่ข้อมูลอีกเล็กน้อยอาจจะดีกว่าถ้าใช้พารามิเตอร์ $ Assoc กับ json_encode ซึ่งจะแปลงเป็นอาร์เรย์ ทรัพย์สินที่คุณได้รับนั้นตั้งชื่อจากการประทับเวลาซึ่งจะเป็นการยากที่จะเข้าถึงเป็นประจำ ในฐานะอาร์เรย์คุณสามารถนับได้ ($ trend [0]);
Rob Drimmie

ฉันน่าจะยกตัวอย่างได้ดีกว่านี้ วัตถุ stdClass มีมากกว่าที่ฉันให้ในตัวอย่าง มี 32 แต่ละอาร์เรย์มี 20 องค์ประกอบ
hellopat

5

ไม่มีอะไรผิดปกติกับ count () ที่นี่ "แนวโน้ม" เป็นคีย์เดียวที่ถูกนับในกรณีนี้คุณสามารถลองทำ:

count($obj->trends);

หรือ:

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

หรืออาจจะทำ:

count($obj, COUNT_RECURSIVE);


0

นับ Arrya ปกติหรือวัตถุ

count($object_or_array); 

นับ arrya หรือวัตถุหลายมิติ

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

-4

count()ฟังก์ชันทำงานร่วมกับอาร์เรย์ แต่ถ้าคุณต้องการนับความยาวของวัตถุคุณสามารถใช้วิธีนี้

$total = $obj->length;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.