2010-10-06 10 views
17

unset के साथ एक संख्यात्मक सरणी कुंजी को हटाने के बाद मुझे json_encode के साथ अजीब व्यवहार का सामना करना पड़ रहा है। निम्नलिखित कोड समस्या को स्पष्ट करना चाहिए। मैं इसे दोनों CLI से और के रूप में एक अपाचे आधुनिक हुई:PHP जेसन_नकोड PHP सरणी के बाद ऑब्जेक्ट के रूप में अनसेट()

PHP संस्करण जानकारी:

C:\Users\usr\Desktop>php -v 
PHP 5.3.1 (cli) (built: Nov 20 2009 17:26:32) 
Copyright (c) 1997-2009 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies 

पीएचपी कोड

<?php 

$a = array(
    new stdclass, 
    new stdclass, 
    new stdclass 
); 
$a[0]->abc = '123'; 
$a[1]->jkl = '234'; 
$a[2]->nmo = '567'; 

printf("%s\n", json_encode($a)); 
unset($a[1]); 
printf("%s\n", json_encode($a)); 

कार्यक्रम आउटपुट

C:\Users\usr\Desktop>php test.php 
[{"abc":"123"},{"jkl":"234"},{"nmo":"567"}] 
{"0":{"abc":"123"},"2":{"nmo":"567"}} 

जैसा कि आप देख सकते हैं, पहली बार $a को JSON में परिवर्तित किया गया है जो इसे जावास्क्रिप्ट सरणी के रूप में एन्कोड किया गया है। दूसरी बार (unset कॉल के बाद) $a जावास्क्रिप्ट ऑब्जेक्ट के रूप में एन्कोड किया गया है। यह क्यों है और मैं इसे कैसे रोक सकता हूं?

+0

+1 क्योंकि एक अच्छी तरह से पूछे जाने वाले प्रश्न को देखना अच्छा होता है। :) – Spudley

उत्तर

16

इसका कारण यह है कि आपके सरणी में एक छेद है: इसमें सूचकांक 0 और 2 हैं, लेकिन याद आती है 1. JSON छेद के साथ सरणी को एन्कोड नहीं कर सकता क्योंकि सरणी वाक्यविन्यास के सूचकांक के लिए कोई समर्थन नहीं है।

आप इसके बजाय array_values($a) एन्कोड कर सकते हैं, जो एक पुन: संशोधित सरणी वापस कर देगा।

+0

वैकल्पिक रूप से आप किसी तत्व को अनसेट करने के बाद सरणी को सॉर्ट कर सकते हैं। – NullUserException

+0

@NullUserException हालांकि आपके सरणी को सॉर्ट करने के साथ-साथ इसका दुष्प्रभाव होगा। – zneak

+0

उन लोगों के लिए जो 'अनसेट' व्यवहार के बारे में सोच रहे हैं, निम्न लिंक देखें और "उपयोगी फ़ंक्शंस" पर स्क्रॉल करें: http://us3.php.net/manual/en/language.types.array.php "अनसेट() फ़ंक्शन किसी सरणी से कुंजियों को हटाने की अनुमति देता है। ध्यान रखें कि सरणी को पुन: एक्सचेंज नहीं किया जाएगा " – leepowers

5

array_values तकनीक यह array_splice का उपयोग करें और एक कदम में एक तत्व और फिर से सूचकांक को दूर करने के लिए संभव है के अलावा: के लिए JSON_FORCE_OBJECT विकल्प का उपयोग करने

array_splice($a, 1, 1); 
+1

संग्रह को गड़बड़ किए बिना नौकरी करने का बिल्कुल सही तरीका, धन्यवाद! – CookieMonster

+1

यह। सबसे सुरुचिपूर्ण तरीका। – DQM

2

प्रयास करें:

unset($a[1]); 

इसके बजाय json_encode, जैसे: json_encode($a, JSON_FORCE_OBJECT) ताकि आपके पास हमेशा एक ही परिणाम होगा।

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