PHP: एक stdClass ऑब्जेक्ट की गणना करें


121

मेरे पास json_decode से बनाई गई एक stdClass वस्तु है जो गिनती ($ obj) फ़ंक्शन चलाने पर सही संख्या नहीं लौटाएगी। ऑब्जेक्ट में 30 गुण हैं, लेकिन गिनती () फ़ंक्शन पर रिटर्न 1 है।

कोई विचार?

नीचे वस्तुओं में से एक का एक उदाहरण है। (मैं ट्विटर से दैनिक प्रवृत्ति की जानकारी का अनुरोध कर रहा हूं)। यदि इस ऑब्जेक्ट में एक से अधिक संपत्ति थी, तो गिनती ($ 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.
हेनरिक ओपल

1
जैसा कि स्टीवन ने बताया , ऑब्जेक्ट प्रकार stdClass का है, जो गणनीय इंटरफ़ेस को लागू नहीं करता है, इस प्रकार गणना (<stdClass ऑब्जेक्ट>) हमेशा वापस आएगी
हेनरिक ओपल

होपेल, आप बिल्कुल सही कह रहे हैं। अगर मैं ऑब्जेक्ट को एक अरै में रखता हूँ तो यह सही संख्या देता है! अति उत्कृष्ट।
नरकोपट

आप एक उत्तर स्वीकार करना चाह सकते हैं। विशेष रूप से जिएवन कि आपने टिप्पणी में लिखा है कि पहला दिया गया उत्तर आपके लिए काम करता है।
एंड्रेस सर्ज

जवाबों:


253

समस्या यह है कि गणना का उद्देश्य अनुक्रमों को एक सरणी में गिनना है, न कि किसी ऑब्जेक्ट पर गुण (जब तक कि यह एक कस्टम ऑब्जेक्ट नहीं है जो काउंटेबल इंटरफ़ेस को लागू करता है)। ऑब्जेक्ट को कास्टिंग की कोशिश करें, नीचे एक सरणी के रूप में और यह देखने में कि क्या मदद करता है।

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

किसी ऑब्जेक्ट को केवल एक सरणी के रूप में कास्टिंग करना हमेशा काम नहीं करेगा लेकिन एक साधारण stdClass ऑब्जेक्ट होने के नाते इसे यहां काम मिलना चाहिए।


9
वेयर करें कि परिणामी सरणी में निजी गुण दिखाई देंगे, जो वास्तव में अप्रत्याशित है।
ह्यूगो मोटा

14
जब यह विधि काम करती है, तो मैं इसे कार्यान्वयन के लिए उपयोग नहीं करूंगा क्योंकि PHP के भविष्य के संस्करणों के कारण यह कोड टूट सकता है, मैं एलन स्ट्रोम के उत्तर को बहुत पसंद करता हूं।
ars265

109

गिनती फ़ंक्शन का उपयोग करने के लिए होता है

  1. Arrays
  2. ऑब्जेक्ट जो वर्ग से प्राप्त होते हैं जो गणनीय इंटरफ़ेस को लागू करते हैं

एक stdClass न तो इनमें से है। आप जो कुछ भी कर रहे हैं उसे पूरा करने का आसान / तेज तरीका

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

यह PHP के get_object_vars फ़ंक्शन का उपयोग करता है , जो किसी ऑब्जेक्ट के गुणों को एक सरणी के रूप में लौटाएगा। फिर आप इस सरणी का उपयोग PHP के काउंट फंक्शन के साथ कर सकते हैं।


1
PHP 7 से पहले, उस get_object_vars()पर stdClassकिसी ऑब्जेक्ट को अरेंज करने से एक खाली एरे मिलेगा। stdClassदूसरी ओर, सरणी को उदाहरण के लिए कास्टिंग करना , हर जगह काम करता है।
XedinUnogn

PHP पर मेरे लिए काम करता है 5.6.30
आर। Daumann

8

ऑब्जेक्ट में 30 गुण नहीं हैं। इसमें एक है, जो कि एक एरी है जिसमें 30 तत्व हैं। आपको उस सरणी में तत्वों की संख्या की आवश्यकता है।


1
डेटा को थोड़ा और बढ़ाते हुए, json_encode के साथ $ assoc param का उपयोग करना बेहतर हो सकता है, जो इसे एक सरणी में परिवर्तित करता है। आपको जो संपत्ति मिल रही है उसका नाम टाइमस्टैम्प से लिया गया है जो नियमित रूप से उपयोग करने के लिए एक सही दर्द होने वाला है। एक सरणी के रूप में आप बस गिनती कर सकते हैं ($ रुझान [0]);
रोब ड्रिमी

मुझे शायद एक बेहतर उदाहरण देना चाहिए था। StdClass ऑब्जेक्ट में केवल एक से अधिक है जो मैंने उदाहरण में दिया था। इसमें 32 हैं, प्रत्येक में 20 तत्वों के साथ एक सरणी है।
नरपत

5

गणना में कुछ भी गलत नहीं है (), "ट्रेंड्स" एकमात्र कुंजी है जिसे इस मामले में गिना जा रहा है, आप यह करने की कोशिश कर सकते हैं:

count($obj->trends);

या:

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

या शायद कर भी रहे हैं:

count($obj, COUNT_RECURSIVE);


0

सामान्य आर्य या वस्तु की गणना करें

count($object_or_array); 

गिनती बहुआयामी आर्य या वस्तु

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

-4

count()समारोह सरणी के साथ काम करता है। लेकिन अगर आप ऑब्जेक्ट की लंबाई गिनना चाहते हैं तो इस विधि का उपयोग कर सकते हैं।

$total = $obj->length;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.