2016-01-26 8 views
5

मेरे पास PHP और JS में एक एप्लिकेशन है। जब मैं ईएसएएल जेएसएन एन्कोडेड PHP सरणी को सरणी प्रकार बदलता हूं। उदाहरण के लिए, अगर मैं इस तरह PHP में एक सरणी है:क्या जेएस ईवाल फ़ंक्शन तत्वों की स्थिति बदलता है?

<?php 
$array = [148 => 'Plane', 149 => 'Car']; 
?> 

<script> 
var array = eval(<?php echo json_encode($array)?>); 
</script> 

जब मैं कंसोल में सरणी प्रिंट, तत्व एक ही स्थिति में नहीं है। क्या आप जानते हैं कि यह कैसे हो सकता है?

अद्यतन

जवाब के लिए धन्यवाद, लेकिन मैं एक जे एस संरचना में बिल्कुल वैसा ही आदेश रखना चाहते हैं, तो मैं एक विशेष क्षेत्र से सरणी ऑर्डर करने के लिए नहीं करना चाहती।

[148 => object, 155 => object, 133 => object] 

मैं आदेश यह है कि के साथ जे एस में इस तरह एक सरणी बनाना चाहते हैं (स्थिति डीबी से आते हैं और यह है कि आदेश हो गया है): हो सकता है क्रम डीबी से प्राप्त की तरह है। क्या यह संभव है?

+0

आपको eval की आवश्यकता नहीं है। 'var array = ;' पर्याप्त है। –

उत्तर

8
<?php echo json_encode($array)?> 

के बाद से सरणी विरल है, इस

{"148":"Plane","149":"Car"} 

जो एक वस्तु है और वस्तु संपत्ति आदेश जे एस में इसकी गारंटी नहीं है करने के लिए हल करता है।

http://php.net/manual/en/function.json-encode.php

नोट: जब एक सरणी एन्कोडिंग, अगर चाबियाँ एक सतत सांख्यिक 0 से शुरू अनुक्रम नहीं हैं, सभी कुंजियों तारों के रूप में इनकोड, और प्रत्येक कुंजी-मान पेयर के लिए स्पष्ट रूप से निर्दिष्ट।

आप वस्तु से एक सरणी, इस तरह बनाने के द्वारा इस का समाधान कर सकते हैं:

var obj = <?php echo json_encode($array)?>; // note, eval not needed 
var arr = []; 
Object.keys(obj).forEach(function(key) { 
    arr[key] = obj[key]; 
}); 

अद्यतन के संबंध में:

आपको अलग से चाबियों का आदेश बचाने की जरूरत है।

var order = <?php echo json_encode(array_keys($array))?>; 
var obj = <?php echo json_encode($array)?>; 
order.forEach(function(key) { 
    console.log(key, obj[key]); // or whatever you need 
}); 

तुम भी निर्माण कर सकते हैं एक ordered map (जो PHP के सरणियों वास्तव में कर रहे हैं, जे एस में सरणियों के विपरीत) अगर आप ES6 या एक polyfill का उपयोग करें।

1

दो प्रकार के JSON डेटा संरचनाएं हैं जिन्हें आपको यहां अंतर करना चाहिए। सुनिश्चित करें कि JSON पार्सर आपके डेटा को अपनी इच्छित संरचना में डाल रहा है। मेरा सुझाव है कि यह शायद इसे ऑब्जेक्ट में डाल रहा है, सरणी नहीं।

this answer से सीधे चुराने: आरएफसी से 7159 -इस जावास्क्रिप्ट ऑब्जेक्ट नोटेशन (JSON) डाटा इंटरचेंज फ़ॉर्मेट (जोर मेरा):

एक वस्तु शून्य या अधिक नाम/मान युग्म के अव्यवस्थित संग्रह है , जहां एक नाम एक स्ट्रिंग है और एक मान एक स्ट्रिंग, संख्या, बूलियन, शून्य, ऑब्जेक्ट, या सरणी है।

एक सरणी ने शून्य या अधिक मानों का अनुक्रम दिया है।

शब्द "ऑब्जेक्ट" और "सरणी" जावास्क्रिप्ट के सम्मेलनों से आते हैं।

और आगे this answer से उद्धृत:

एक सरणी ([]) में तत्वों का क्रम बनाए रखा है। "ऑब्जेक्ट" ({}) में तत्वों (नाम: मूल्य जोड़े) का क्रम नहीं है, और उनके लिए सामान्य "जेम्बल" होना सामान्य है, यदि JSON फ़ॉर्मेटर/पार्सर द्वारा नहीं तो भाषा-विशिष्ट वस्तुओं (शब्दकोश) , NSDictionary, हैशटेबल, आदि) जिनका उपयोग आंतरिक प्रतिनिधित्व के रूप में किया जाता है।

+0

धन्यवाद मशीन की इच्छा है, और एक PHP सरणी को जेएस सरणी में बदलने का कोई तरीका है? क्योंकि अगर मैं json_encode का उपयोग करता हूं तो यह किसी ऑब्जेक्ट में बदल जाता है। –

2

पहले पोस्टर पहले से ही इस प्रश्न का उत्तर दे चुके हैं। बस इसे जोड़ने के लिए:

कई लोग भ्रमित हो जाते हैं क्योंकि वे जावास्क्रिप्ट ऑब्जेक्ट्स को PHP में सहयोगी सरणी के रूप में सोचते हैं। हालांकि यह मामला काफी नहीं है। हालांकि यह सच है कि हम जावास्क्रिप्ट में ऑब्जेक्ट्स का उपयोग करके एक PHP एसोसिएटिव सरणी के करीब एक डेटा संरचना को अनुकरण कर सकते हैं, वे पूरी तरह से अलग-अलग डेटा संरचनाएं हैं और सरणी के समान तरीके से काम नहीं करते हैं।

सरणी में सूचकांक स्थिति की अखंडता डेटा संरचना और सूचकांक संबंध परिप्रेक्ष्य से महत्वपूर्ण है, यही कारण है कि उनका आदेश बनाए रखा जाता है। हालांकि, वही नियम ऑब्जेक्ट्स से कोई फर्क नहीं पड़ता क्योंकि उनके "छद्म नाम-सूचकांक" (जो वास्तव में केवल संपत्ति का नाम है), जगह-निर्भर नहीं है। यह तब तक किसी भी क्रम में मौजूद हो सकता है जब तक कि उस संपत्ति के पास अभी भी वही मूल्य दिया गया हो।

उम्मीद है कि इससे मदद मिलती है।

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