2012-04-26 12 views
19

निम्नलिखित की तरह एक साहचर्य सरणी को देखते हुए,क्या सरणी का क्रम सरणी_कुछ से इनपुट सरणी में ऑर्डर जैसा ही है?

$field_defaults = array(
    'id' => 0, 
    'name' => 'new item', 
    'desc' => '', 
    'parent_id' => 0, 
); 

मैं array_keys() क्रम में चाबियाँ लौटने पर भरोसा कर सकते वे निर्दिष्ट कर रहे थे? या, अधिक सटीक, के बाद से PHP में सरणियों एक स्थिर आदेश है, प्रति this answer के रूप में, कुंजी उसी क्रम में array_keys() द्वारा दिया जाता है क्योंकि वे इनपुट सरणी में दिखाई देते हैं लगता है? manual page कोई संकेत नहीं देता है।

जब मैं इसे आज़माता हूं, तो वे मूल आदेश का सम्मान करने के लिए प्रतीत होते हैं, लेकिन मैं उस व्यवहार पर भरोसा करने में सक्षम होना चाहता हूं।

उत्तर

30

टी एल; डॉ: सैद्धांतिक रूप से आप उस पर भरोसा नहीं कर सकते; व्यावहारिक उद्देश्यों के लिए आप कर सकते हैं आईएमओ।


चूंकि दस्तावेज़ ऑर्डरिंग की गारंटी नहीं देते हैं तो तकनीकी रूप से सही उत्तर "नहीं होगा, आप उस पर भरोसा नहीं कर सकते"।

ऐसा इसलिए है क्योंकि सैद्धांतिक रूप से डेवलपर्स खुद को भविष्य की तारीख में कार्यान्वयन को बदलने का विकल्प आरक्षित कर सकते थे ताकि यह मौजूदा आदेश का सम्मान न करे (शायद प्रदर्शन में सुधार करने के लिए, या कुछ अन्य लाभ प्राप्त करने के लिए) ।

अब एक व्यावहारिक मामले के रूप में, हम जानते हैं कि the current implementation honors the ordering - पीएचपी सरणियों कंटेनर आदेश दिया जाता है (वहाँ अन्य बातों के अलावा मूल्यों की एक लिंक्ड सूची है) - और यह कुछ आप कभी भी बदलना नहीं होता है ।

यदि ऐसा हुआ, तो परिवर्तन एरे के आंतरिक कार्यान्वयन में एक महत्वपूर्ण महत्वपूर्ण परिवर्तन के लिए संकेत देगा और इससे बदले में कई अन्य कोड भी तोड़ने की संभावना होगी। मुझे यह जल्द ही नहीं हो रहा है।

+0

स्रोत, ल्यूक पढ़ें। OpenGrok के लिए –

+0

+1 –

1

यदि आप चिंतित हैं, तो आप हमेशा एक को सही क्रम के रूप में चुन सकते हैं और फिर उस पर आधारित अन्य फ़ंक्शन को फिर से कार्यान्वित कर सकते हैं। और यदि आप दो कॉल के बीच स्थिरता की परवाह करते हैं, तो आप शायद एक ही समय में array_keys और array_values दोनों को कॉल करने जा रहे हैं। तो एक साथ दोनों क्यों नहीं करते? उदाहरण के लिए, मान लीजिए कि array_keys() का क्रम "सही" है। फिर करें:

function arrayKV($arr) { 
    $keys = array_keys($arr); 
    $values = array(); 
    foreach($keys as $key) { 
     $newArr[] = $arr[$key]; 
    } 
    return array('keys' => $keys, 'values' => $values); 
} 

इस तरह, आप जानते हैं कि वे एक ही क्रम में हैं। वैकल्पिक रूप से, आप ऑर्डर के रूप में उपयोग करने के लिए कुंजी प्रदान कर सकते हैं:

function arrayValuesStable($arr, $keys) { 
    $values = array(); 
    foreach($keys as $key) { 
     $values[] = $arr[$key]; 
    } 
    return $values; 
} 
संबंधित मुद्दे