2010-12-07 21 views
5

PHP 5.3 में जिस तरह से सरणी नियंत्रित की जाती है।PHP 5.3 ऐरे संगतता

उदाहरण सरणी:

array(
    'foo' => 3, 
    'bar' => 2 
) 
अब 5.3 में

यह रिटर्न

array(
    'foo' => 1, 
    'bar' => 2 
) 

:

<?php $a = array ('foo' => 1, 'bar' => 2, 'foo' => 3); ?> 

उपयोग लिखने से अधिक सरणी में पिछले एक देने के लिए साथ 'foo' के लिए मैं एक php v5.2.11 पर परीक्षण कर रहा हूं इसलिए मैं इस स्वयं का परीक्षण नहीं कर सकता हूं यह उदाहरण php.net वेबसाइट से है: http://php.net/manual/en/language.types.array.php और के लिए 5.3

पेज खोज के माध्यम से

<?php 
    $a['foo'] = 1; 
    $a['bar'] = 2; 
    $a['foo'] = 3; 
?> 

मूल्य निर्धारित करने की विधि इस समस्या के लिए एक पिछड़े संगत पैच प्रदान करेगा? क्या php के नए संस्करण में सरणी से निपटने के लिए देखने के लिए कोई और चीज है?

+1

इस रूप में अपरिभाषित व्यवहार को वर्गीकृत होगा। लेकिन बीटीडब्ल्यू, 5.3 अभी भी अंतिम मूल्य के साथ ओवरराइट करता है। – mario

+0

"यह उदाहरण php.net वेबसाइट से है" - क्या आप इससे लिंक कर सकते हैं? – salathe

उत्तर

0

मुझे लगता है कि आपको सरणी के लिए अद्वितीय कुंजी का उपयोग करना चाहिए।

<?php $a = array ('foo' => 1, 'bar' => 2); ?> 

फिर foo के मान को अपडेट करें।

<?php $a['foo'] = 3; ?> 
+0

यह मुद्दा नहीं है, अन्य मामलों पर पुष्टि के रूप में एक बग है, यह एक दस्तावेज परिवर्तन नहीं है। – RobertPitt

2

मैनुअल से:

ध्यान दें कि जब दो समान सूचकांक परिभाषित कर रहे हैं, पिछले अधिलेखित पहले।

तो जब तक कि आपने किसी भी तरह से एक PHP बग (असंभव) ट्रिगर नहीं किया है, तो कुछ और हो रहा है जिस पर आप गायब हैं।

और अपने प्रश्न का उत्तर देने के लिए, हाँ, असाइनमेंट ऑपरेटर के माध्यम से ओवरराइटिंग कुंजी काम करता है। हालांकि, इससे पहले कि आप कोड बदलना शुरू करें, मैं यह सुनिश्चित करने के लिए जांच करूँगा कि समस्या वर्तमान में आप क्या सोचते हैं, क्योंकि मैन्युअल सीधे दावा करता है कि बाद वाली कुंजी पूर्व को ओवरराइट कर देगी।

अद्यतन: @ sberry2A का लिंक ऐसी जगह प्रकट करता है जहां PHP 5.3 छोटी है (यानी मैन्युअल कहता है)।

class Foo 
{ 
    const A = 1; 
    const B = 1; 

    public static $bar = array(self::A => 1, self::B => 2); 
} 

एक उम्मीद होती है कि Foo::$bar[1] का मूल्य 2 है, लेकिन यह अभी भी 1 है। हालांकि, ठीक से निम्नलिखित काम करता है:

class Foo 
{ 
    const A = 1; 
    const B = 1; 

    public static function bar() 
    { 
    return array(self::A => 1, self::B => 2); 
    } 
} 

तो यह केवल अलग स्थिरांक एक ही मूल्य है कि द्वारा अनुक्रमित स्थिर संपत्ति सरणियों के उस विशिष्ट मामला है। PHP 5.3.3 में यही एकमात्र तरीका है कि मैं व्यवहार को ट्रिगर कर सकता हूं, लेकिन शायद इसके अलावा अन्य तरीके भी हैं ... जाहिर है कि एक निश्चित व्यवहार पर भरोसा नहीं किया जा सकता है।