2009-08-22 18 views
81

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

कोई विचार?

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

क्या आप अपना उदाहरण स्पष्ट कर सकते हैं? जैसा कि आपने इसे पोस्ट किया है, इसमें एक संपत्ति है '200 9 -21-21 11: 05', 20 प्रविष्टियों के साथ एक सरणी है, इसलिए गिनती ($ रुझान) सही ढंग से वापस आ जाएगी 1. –

+1

[स्टीवन ने बताया] (http://स्टैक ओवरफ़्लो।कॉम/प्रश्न/1314745/php-count-an-stdclass-object/1314754 # 1314754), ऑब्जेक्ट प्रकार stdClass प्रकार है, जो गणना योग्य इंटरफ़ेस को लागू नहीं करता है, इस प्रकार गिनती () हमेशा वापस आ जाएगी 1. –

+0

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

उत्तर

168

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

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

, बस एक सरणी हमेशा काम नहीं करेगा के रूप में एक वस्तु कास्टिंग लेकिन किया जा रहा है एक सरल stdClass आपत्ति यह काम यहाँ किया जाना चाहिए।

+8

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

+9

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

9

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

+1

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

+0

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

4

() यहाँ गिनती के साथ कुछ भी गलत नहीं, "रुझान" केवल महत्वपूर्ण यह है कि इस मामले में गिना जा रहा है नहीं है, तुम क्या कर की कोशिश कर सकते हैं:

count($obj->trends); 

या:

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

या हो सकता है यहां तक ​​कि कर:

count($obj, COUNT_RECURSIVE); 
85

गिनती समारोह

पर इस्तेमाल किया जा करने के लिए है
  1. सरणी
  2. वस्तुओं है कि कक्षाओं कि गणनीय इंटरफ़ेस

एक stdClass इनमें से कोई भी है को लागू से हुआ है। आसान/तेज तरीका पूरा करने के लिए क्या आप के बाद कर रहे हैं

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

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

+0

PHP 7 से पहले, 'st_Clject_vars() '' stdClass' पर जो किसी ऑब्जेक्ट को सरणी कास्टिंग करने के परिणामस्वरूप एक खाली सरणी उत्पन्न करेगा। दूसरी तरफ 'stdClass' उदाहरण सरणी को कास्ट करना, हर जगह काम करता है। – XedinUnknown

-2

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

$total = $obj->length; 
0

बस का उपयोग इस

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

चर $i चाबियाँ की संख्या है।

संबंधित मुद्दे