2012-05-28 5 views
17

PHP में एक multidimensional सरणी json_encode करते समय, मैं नामकरण के विपरीत, एक सरणी नामकरण करके बस एक अलग आउटपुट देख रहा हूं। उदाहरण के लिए:बहु-आयामी सरणी के JSON_ENCODE अलग-अलग परिणाम दे रहे हैं

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); 
json_encode($arrytest) 

कई json की एक सारिणी वस्तुओं

[{"a":1,"b":2},{"c":3},{"d":4}]; 

बस बीच सरणी

$arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4)); 
json_encode($arrytest) 

के लिए एक नाम बताए जबकि देता है के साथ एक एकल json वस्तु बनाता है

के अंदर एकाधिक जेसन ऑब्जेक्ट्स
{"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}}; 

क्यों 1 विकल्प "secondarray"

+0

http://json.org/ –

+3

फ़ेलिक्स क्लिंग, आपने मेरा जेसन-एन्कोड टैग क्यों हटाया? मैं यह नहीं कह रहा हूं कि आपके पास नहीं होना चाहिए, बल्कि मैं यह सुनिश्चित करना चाहता हूं कि मैं टैगिंग के लिए सही प्रक्रिया को अनुपालन कर रहा हूं, क्योंकि जेसन-एन्कोड मेरे कोड में है, हालांकि यह उचित टैग के रूप में लागू होगा। – dangel

उत्तर

25

JSON में, सरणियों [] केवल हर संख्यात्मक कुंजियों है, के स्थान पर "1" के साथ 2 execpt रूप में एक ही reasults वापस नहीं होगा, जबकि वस्तुओं स्ट्रिंग गुण होते हैं {} । आपके दूसरे उदाहरण में एक सरणी कुंजी को शामिल करने से पूरी बाहरी संरचना को आवश्यकता के अनुसार एक वस्तु बनने के लिए मजबूर किया जाता है। स्ट्रिंग कुंजियों a,b,c,d को शामिल करने के कारण दोनों उदाहरणों की आंतरिक वस्तुएं वस्तुओं के रूप में बनाई गई हैं।

यदि आप पहले उदाहरण पर JSON_FORCE_OBJECT विकल्प का उपयोग करना चाहते थे, तो आपको बाहरी संरचना को एक सरणी के बजाए ऑब्जेक्ट के साथ दूसरी संरचना में वापस लेना चाहिए। यह निर्दिष्ट किए बिना कि आप इसे किसी ऑब्जेक्ट के रूप में चाहते हैं, बाहरी सरणी में स्ट्रिंग कुंजियों की अनुपस्थिति PHP को मान लेती है कि इसे JSON में समतुल्य सरणी संरचना के रूप में एन्कोड किया जाना है।

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); 

// Force the outer structure into an object rather than array 
echo json_encode($arrytest , JSON_FORCE_OBJECT); 

// {"0":{"a":1,"b":2},"1":{"c":3},"2":{"d":4}} 
+4

फिर जावास्क्रिप्ट के साथ कुछ भी नहीं होने पर इसे जावास्क्रिप्ट ऑब्जेक्ट नोटेशन क्यों कहते हैं। – Brendan

+0

अब समझ में आता है, उस स्पष्टीकरण के लिए धन्यवाद मुझे लगता है कि मुझे सही दिशा में ले जाया जाएगा। – dangel

+1

@ ब्रेंडन जावास्क्रिप्ट के साथ इसका कोई संबंध नहीं है? – deceze

0

निरंतर संख्यात्मक कुंजी वाले Arrays JSON arrays के रूप में एन्कोड किए गए हैं। यह वही है। क्यूं कर? क्योंकि यह समझ में आता है।

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

json_encode documentation में सभी उदाहरण देखें।

+0

मैं नहीं कह रहा हूं कि वे नहीं होना चाहिए, इसलिए मैं सवाल पूछ रहा था। – dangel

0

पहले विकल्प पर आपके पास केवल संख्यात्मक अनुक्रमणिका (0, 1 और 2) हैं। हालांकि उन्हें स्पष्ट रूप से घोषित नहीं किया गया है, php स्वचालित रूप से उन्हें बनाता है।

दूसरे विकल्प पर, आप इंडेक्स में से एक को एक स्ट्रिंग के रूप में घोषित करते हैं और यह PHP को आंतरिक रूप से सभी इंडेक्स को स्ट्रिंग में बदल देता है।

जब आप json एनकोड पहली सरणी, यह आवश्यक नहीं उत्पन्न json स्ट्रिंग में पूर्णांकों को दिखाने के लिए है, क्योंकि किसी भी विकोडक "अनुमान" के लिए वे कर रहे हैं कि सक्षम होना चाहिए है 0, 1 और 2

लेकिन में दूसरी सरणी, यह आवश्यक है, क्योंकि डिकोडर को आपके सरणी में महत्वपूर्ण मान पता होना चाहिए।

यह बहुत आसान है। सरणी में घोषित कोई अनुक्रमणिका नहीं? वे 0, 1, 2, 3 और इतने पर हैं।

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