2012-07-17 11 views
27

मेरे पास एक PHP सरणी है जिसमें स्ट्रिंग प्रकार के रूप में संख्यात्मक कुंजी होती है।स्ट्रिंग के रूप में संख्यात्मक कुंजी वाले PHP सरणी का उपयोग नहीं किया जा सकता

लेकिन जब मैं कोशिश करता हूं और उन्हें एक्सेस करता हूं तो PHP मुझे एक अपरिभाषित अनुक्रमणिका त्रुटि दे रहा है।

$a = (array)json_decode('{"1":1,"2":2}'); 
var_dump($a); 
var_dump(isset($a[1])); 
var_dump(isset($a["1"])); 
var_dump($a[1]); 
var_dump($a["1"]); 

आउटपुट:

 
array (size=2) 
    '1' => int 1 
    '2' => int 2 

boolean false 

boolean false 

ERROR: E_NOTICE: Undefined offset: 1 

null 

ERROR: E_NOTICE: Undefined offset: 1 

null 

मैं कैसे इन मूल्यों उपयोग करते हैं?

डेमो: http://codepad.viper-7.com/8O03IM

+1

प्रतिष्ठा +100 देने से पहले ही समाप्त हो गई है:

यहाँ मेरी समाधान है। –

+8

@ जोसुआमार्सेल क्रिसिसानो: बक्षीस की समयसीमा समाप्त होने से 6 दिन पहले हैं। बक्षीस अभी कल शुरू हुआ था। उसे एक ब्रेक दें। इसके अलावा 6 दिनों बाद उसे फिर से याद दिलाने की कोई आवश्यकता नहीं है - सिस्टम ऐसा करेगा। – BoltClock

उत्तर

27

तो, मैं किसी अन्य से नहीं देखा है जवाब इस पर स्पर्श करते हैं, लेकिन @xdazz करीब आ गया।

php > $obj = json_decode('{"1":1,"2":2}'); 

php > print_r($obj); 
stdClass Object 
(
    [1] => 1 
    [2] => 2 
) 

php > var_dump($obj); 
object(stdClass)#1 (2) { 
    ["1"]=> 
    int(1) 
    ["2"]=> 
    int(2) 
} 

आप तार का उपयोग करना चाहते हैं, हम जानते हैं कि निम्नलिखित असफल हो जायेगी:

php > echo $obj->1; 

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `'{'' or `'$'' in php shell code on line 1 

प्रवेश

के हमारे पर्यावरण शुरू करते हैं, $obj एक डीकोड स्ट्रिंग के ऑब्जेक्ट नोटेशन के बराबर होती है ऑब्जेक्ट वेरिएबल्स

आप इसे इस तरह एक्सेस कर सकते हैं:

php > echo $obj->{1}; 
1 

कौन कह रूप में ही है:

php > echo $obj->{'1'}; 
1 

सरणी चर

मुद्दा सरणियों के साथ एक्सेस करना है कि निम्न वापसी खाली है, जो typecasting के साथ मुद्दा है।

php > echo $obj[1]; 
php > 

आप इसे वापस टाइपकास्ट हैं, वस्तु एक बार फिर से पहुँचा जा सकता है:

function array_key($array, $key){ 
    $obj = (object) $array; 
    return $obj->{$key}; 
} 

उदाहरण उपयोग:

php > $obj = (object) $obj; 
php > echo $obj->{1}; 
1 

यहाँ एक समारोह है जो आप के लिए ऊपर स्वचालित करेगा है

php > $obj = (array) $obj; 
php > echo array_key($obj, 1); 
1 

php > echo array_key($obj, 2); 
2 
+1

अच्छा जवाब .... – Petah

25

आप सरणी चाहते हैं, true को json_decode के दूसरे पैरामीटर सेट।

$a = json_decode('{"1":1,"2":2}', true); 

संपादित करें: जब आप सरणी के लिए एक एसटीडी वस्तु डाली, सांख्यिक स्ट्रिंग कुंजी संख्या के लिए डाली नहीं करता है। यहां एक उदाहरण है।

$obj = new stdClass; 
$obj->{'1'} = 1; 
$arr = (array) $obj; 
var_dump($arr); 
var_dump(isset($arr[1])); 
+0

धन्यवाद, यह मेरी समस्या के लिए काम करता है। बोनस पॉइंट्स यदि आप किसी प्रकार की कुंजी के साथ सरणी तक पहुंचने का कोई तरीका ढूंढ सकते हैं। – Petah

+4

@Petah यह PHP की समस्या है, लेकिन आप अभी भी 'foreach' के माध्यम से कुंजी और मूल्य प्राप्त कर सकते हैं। – xdazz

14

जाहिर है, यह एक ज्ञात मुद्दा है, और इसे ठीक करने की कोई योजना नहीं है; देखें Doc Bug #45959 Object to array conversion leads to weird behaviour:

फिक्सिंग जो एक परफॉर्मेंस कमी का तात्पर्य है, इसलिए बेहतर लगता है कि इसे एक ज्ञात समस्या के रूप में रखा जाए, लेकिन दस्तावेज किया गया।

यह wonkiness है (फिर) documentation for the array type (जोर मेरा) में टिप्पणी की थी

एक वस्तु एक सरणी में बदल जाती है, तो परिणाम एक सरणी जिसका तत्वों ऑब्जेक्ट के गुणों हो रहा है। कुंजी कुछ उल्लेखनीय अपवाद के साथ, सदस्य चर नाम हैं: पूर्णांक गुण unaccessible हैं .... यह कुछ अनपेक्षित व्यवहार में परिणाम कर सकते ....

+1

अच्छा जवाब! मुझे कहना है कि एक सरणी को कास्टिंग एक नया नियम घोषित करने के लिए पर्याप्त तोड़ दिया गया है: PHP में किसी भी सरणी को कभी भी नहीं डाला। –

1

हां। मैं सहमत हूं, PHP को ऑब्जेक्ट से सरणी में टाइपकास्टिंग के साथ समस्या है लेकिन foreach बुद्धिमानी से ऑब्जेक्ट या सहयोगी सरणी को संभालना है।

$a = json_decode('{"1":1,"2":2}'); //need not typecast but doesnt break even if u typecast 

foreach ($a as $k=>$v){ 
    echo $v; 
} 
1

मुझे हाल ही में एक ही समस्या से मुलाकात हुई।

$obj = new stdClass(); 
$obj->{'0'} = "test"; 

$array = (array)$obj; 
foreach ($array as $key => $value) { 
    $array[$key] = strtoupper($value); 
} 
var_dump($array); 

इस कोड को आउटपुट:

array(2) { 
    ["0"]=> 
    string(4) "test" 
    [0]=> 
    string(4) "TEST" 
} 

पाया कि जब विधि सरणी recursivly वस्तुओं कन्वर्ट करने के लिए डीबगिंग, मैं पागल हो गया है।

1

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

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