2011-08-10 18 views
5

हमारे पास एक सरणी है जिसमें कुंजी स्ट्रिंग हैं, लेकिन कभी-कभी वे स्ट्रिंग संख्याएं होती हैं (उदा। "123")। कुंजी "123" द्वारा सरणी तक पहुंचने का प्रयास करते समय, हमें एक अनिर्धारित इंडेक्स नोटिस मिलता है। केवल पूर्णांक 123 तक इसे एक्सेस करते समय, हमें अपरिभाषित ऑफसेट नोटिस मिलता है। यह हमें बताता है कि हम "123" स्ट्रिंग का उपयोग करके इसे सही तरीके से अनुक्रमित करने का प्रयास कर रहे हैं, लेकिन यह अभी भी सेट नहीं है।स्ट्रिंग कुंजी एक्स द्वारा एक्सेस सरणी, जहां x "123"

इस SO प्रश्न के लिए उदाहरण के साथ आने का प्रयास करना मुश्किल है, क्योंकि PHP हमारे परीक्षण मामले में सरणी कुंजी को स्वचालित रूप से पूर्णांक में परिवर्तित करता है, जबकि हमारे असली दुनिया में यह ऐसा नहीं होता है (जावा के उपयोग के कारण) पुल)। परीक्षण सरणी अब हम कोशिश कर रहे हैं:

<?php 
$array = array("123" => array(108, 8)); 
var_dump($array); 
?> 

यह रिटर्न:

array(1) { [123]=> array(2) { [0]=> int(108) [1]=> int(8) } } 

हमारे वास्तविक दुनिया बराबर में है, यह वापसी होगी:

array(1) { ["123"]=> array(2) { [0]=> int(108) [1]=> int(8) } } 

तो असली में दुनिया सूचकांक वास्तव में एक स्ट्रिंग है:

<?php 
var_dump(array_keys($array)); 
?> 
<?php 
foreach ($array as $key => $value) { 
    if (!isset($array[$key])) { 
     print "What is happening here?"; 
    } 
} 
?> 

जो देता है::

What is happening here? 

योशी की टिप्पणी के आधार पर, यहाँ काम कर रहा है परीक्षण कोड:

210 रिटर्न

array(1) { [0]=> string(3) "123" } 

तो, अंत में सवाल निम्नलिखित कोड का उत्पादन होता है

<?php 
$array = (array)json_decode('{"123":[108,8]}'); 
foreach ($array as $key => $value) { 
    if (!isset($array[$key])) { 
     print "What is happening here?"; 
    } else { 
     print "Nothing to see here, move along"; 
    } 
} 
?> 
+1

अपने प्रश्न के लिए उत्तर पर तुम्हारी मदद नहीं कर सकता:

यहाँ मेरी समाधान है। लेकिन अगर आप '$ array = (array) json_decode (' {"123": [108,8]} ') का उपयोग करते हैं, तो आपको अपना असली उदाहरण मिलेगा (जिसमें' 123' स्ट्रिंग कुंजी के रूप में) होगा। शायद यह दूसरों को समस्या को पुन: उत्पन्न करने में मदद करेगा। – Yoshi

+0

(संदर्भ) http: // कोडेपैड।संगठन/ewMJyKDU मुझे लगता है कि यह वास्तव में एक दिलचस्प सवाल है। और उम्मीद है कि कोई व्यवहार पर कुछ प्रकाश साझा कर सकता है। – Yoshi

उत्तर

2

नहीं बहुत सुरुचिपूर्ण समाधान भी, लेकिन यह भी काम करता है और सरणी पुनः बनाने की आवश्यकता नहीं है। इसके अलावा, आप तत्व मान का उपयोग कर सकते हैं।

$array = (array)json_decode('{"123":100}'); 
$array_keys = array_keys($array); 
$array = (object)$array; 

foreach ($array_keys as $key) 
{ 

    if (!isset($array->$key)) 
    { 
     print "What is happening here?"; 
    } 
    else { 
     print "It's OK val is {$array->$key}"; 
    } 
} 

नोट $$array->$key में महत्वपूर्ण से पहले, यह महत्वपूर्ण है।

+0

देर से स्वीकृति के लिए खेद है, अंततः यह जांचने के लिए चारों ओर मिल गया। दरअसल, यह बहुत ही सुरुचिपूर्ण नहीं है, लेकिन यह निश्चित रूप से काम करता है। – drvdijk

1

इसे देखें कोड (और लाइन $array[(string)$key])

<?php 
$array = array("123" => array(108, 8)); 

foreach ($array as $key => $value) 
{ 
    if (!isset($array[(string)$key])) 
    { 
     print "What is happening here?"; 
    } 
    else print "It's just types"; 
} 

$ कुंजी का प्रकार स्वचालित रूप से पूर्णांक casted था, और यह इसलिए इस कुंजी सरणी में नहीं मिला था।

इसके बारे में सभी जानकारी के मैनुअल में पा सकते हैं: http://php.net/manual/en/language.types.type-juggling.php

इस कोड होगा दोनों ही मामलों के साथ काम करता है:

foreach ($array as $key => $value) 
{ 
    if (!array_key_exists($key, $array)) 
    { 
     print "What is happening here?"; 
    } 
    else print "It's just types"; 
} 
+1

'$ array = (array) json_decode ('{" 123 ": [108,8]}') का उपयोग करने का प्रयास करें;'। यह 'यहां क्या हो रहा है' प्रिंट करेगा? – Yoshi

+0

@ योशी ने कोशिश की है? यह "यह सिर्फ प्रकार है" आउटपुट करता है। और json_decode में सरणी वापस करने के लिए दूसरा तर्क है। –

+0

हमने कोशिश की है। यह आउटपुट करता है "यहाँ क्या हो रहा है?"। हमने परीक्षण कोड के साथ प्रश्न अपडेट किया है जिसका हमने उपयोग किया था। – drvdijk

0

मुझे एक ही समस्या थी (लेकिन array_intersect_key के साथ)।

$array = array_combine(array_keys($array), $array) 
संबंधित मुद्दे