2012-06-18 20 views
25

मैं एक सरणी और PHP है और मैं मान रहा पहुँच करने की जरूरत है देख सकते हैं जब मैं इसे प्रिंट मौजूद पहुंच के दौरान, लेकिन मैं एक PHP सूचना हो रही है जब मैं उनके प्रमुख द्वारा उन्हें एक्सेस करके देखें। मैं print_r के साथ सरणी मुद्रित:अपरिभाषित ऑफसेट सरणी तत्व जो

Array 
(
    [207] => sdf 
    [210] => sdf 
) 

जब मैं सूचकांक मैं एक अपरिभाषित ऑफसेट नोटिस मिलता है का उपयोग कर सरणी तक पहुँचने का प्रयास।

print_r($output); 
echo $output[207]; // Undefined Offset 
echo $output["207"]; // Undefined Offset 

$output सरणी array_diff_key के लिए एक कॉल का परिणाम है और इनपुट एक HTTP POST अनुरोध के माध्यम से मूल रूप से JSON के रूप में है: यहाँ मेरी कोड है।

array_keys मुझे देता है निम्नलिखित:

Array 
(
    [0] => 207 
    [1] => 210 
) 

जवाब में टिप्पणी करने के लिए:

var_dump(key($output)); आउटपुट:

string(3) "207" 

var_dump(isset($output[key($output)])); आउटपुट:

bool(false) 
+1

'var_dump (कुंजी ($ आउटपुट)) आज़माएं और हमें बताएं कि आपको क्या मिलता है। – deceze

+0

अधिक जानकारी की आवश्यकता है। क्या संदर्भ? क्या यह सर्वर-साइड स्क्रिप्ट में है? –

+0

@deceze: यह आउटपुट 'स्ट्रिंग '207' (लंबाई = 3)' –

उत्तर

1

मैं सिर्फ this bug जो सरणी तत्वों PHP में कभी कभी दुर्गम होने के लिए जब सरणी unserialize के लिए एक कॉल द्वारा बनाई गई है का कारण बनता है मिल गया है। आप त्रुटियों मिलता है

<?php 

$a = unserialize('a:2:{s:2:"10";i:1;s:2:"01";i:2;}'); 

print $a['10']."\n"; 

$a['10'] = 3; 
$a['01'] = 4; 

print_r($a); 

foreach ($a as $k => $v) 
{ 
    print 'KEY: '; 
    var_dump($k); 
    print 'VAL: '; 
    var_dump($v); 
    print "\n"; 
} 

आप इसे में इस बग के साथ PHP का एक संस्करण है और मैं पीएचपी को अपग्रेड करने की अनुशंसा:

एक परीक्षण पीएचपी युक्त फ़ाइल निम्न स्क्रिप्ट बनाएं (या कमांड लाइन से चलाने) 5,3

+0

मैं पहले ही 5.3.10 का उपयोग कर रहा हूं। –

+0

मैं उसी समस्या में फंसे PHP 5.6 का उपयोग कर रहा हूं – Linus

0

कैसे आप सरणी मुद्रित किया? मेरा सुझाव है print_r($arrayName);

इसके बाद, आप की तरह अलग-अलग तत्वों मुद्रित कर सकते हैं: echo $arrayName[0];

+0

जैसा कि आप देख सकते हैं, मैंने 'print_r' का उपयोग किया था। और [0] द्वारा इसका उपयोग करना एक विकल्प नहीं है। –

1

var_dump($output); 
foreach ($output as $key => val) { 
    var_dump($key); 
    var_dump($val); 
} 

क्या हो रहा है के बारे में अधिक जानने की कोशिश करें।

क्या सटीक लाइन/बयान आप एक चेतावनी फेंक रहा है?

24

PHP Manual में एक सरणी के लिए एक वस्तु में परिवर्तित करने पर इस खंड देखें:

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

PHP में किसी ऑब्जेक्ट से किसी सरणी में कनवर्ट करते समय, पूर्णांक सरणी कुंजियां आंतरिक रूप से तारों के रूप में संग्रहीत होती हैं। जब आप PHP में सरणी तत्वों का उपयोग करते हैं या सामान्य रूप से सरणी का उपयोग करते हैं, तो जिन कुंजीों में वैध पूर्णांक होते हैं उन्हें स्वचालित रूप से पूर्णांक में परिवर्तित कर दिया जाएगा। स्ट्रिंग के रूप में आंतरिक रूप से संग्रहीत एक पूर्णांक एक पहुंच योग्य कुंजी है।

नोट अंतर:

$x = (array)json_decode('{"207":"test"}'); 
var_dump(key($x)); // string(3) "207" 

var_dump($x); 
// array(1) { 
// ["207"]=> 
// string(4) "test" 
// } 


$y['207'] = 'test'; 
var_dump(key($y)); // int(207) 

var_dump($y); 
// array(1) { 
// [207]=> 
// string(4) "test" 
// } 

दोनों उन सरणियों पर print_r समान उत्पादन देता है, लेकिन var_dump के साथ मतभेदों को देख सकते हैं।

$output = (array)json_decode('{"207":"sdf","210":"sdf"}'); 

print_r($output); 
echo $output[207]; 
echo $output["207"]; 

और उन्हें आसानी से ठीक वैकल्पिक assoc तर्क के लिए json_decode को true में पारित करने के लिए, कि तुम एक सरणी एक वस्तु नहीं चाहता निर्दिष्ट करने के लिए है:

यहाँ कुछ कोड है कि reproduces अपने सटीक समस्या है

$output = json_decode('{"207":"sdf","210":"sdf"}', true); 

print_r($output); 
echo $output[207]; 
echo $output["207"]; 
+0

मूल सरणी JSON पोस्ट से डीकोड की गई है। लेकिन जिस सरणी में मुझे समस्या है, वह array_diff_key कॉल का परिणाम है। –

+0

@ केविनवेव हां, क्योंकि कॉल के इनपुट सरणी में एक ही समस्या है। 'Array_diff_key' के पहले तर्क के रूप में आप जिस भी सरणी में गुजर रहे हैं, उसमें '$ arr [207]' तक पहुंचने का प्रयास करें और आपको एक ही समस्या दिखाई देगी। आपको उस समस्या का स्रोत ठीक करने की आवश्यकता है जो किसी ऑब्जेक्ट को किसी ऑब्जेक्ट पर किसी सरणी पर कास्टिंग करने से कुछ बिंदुओं पर उपयोग करने से होगा: '$ array = (array) $ obj;' – Paulpro

+0

मैंने मूल सरणी बदलने की कोशिश की। और कुछ अन्य चीजों की कोशिश की। कुछ भी काम नहीं किया। मैं foreach looping के माध्यम से कुंजी/मूल्य प्राप्त करना समाप्त हो गया। लेकिन यह एक बग प्रतीत होता है। :-) –

19

समस्या पैदा होती है जब castingarray को कोई चीज स्ट्रिंग कुंजी मान्य पूर्णांक हैं है।

आप इस वस्तु है, तो:

object(stdClass)#1 (2) { 
    ["207"]=> 
    string(3) "sdf" 
    ["210"]=> 
    string(3) "sdf" 
} 

और आप

$array = (array)$object 

के साथ डाली तो आप इस सरणी

array(2) { 
    ["207"]=> 
    string(3) "sdf" 
    ["210"]=> 
    string(3) "sdf" 
} 

जो कुंजी है कि केवल पाशन द्वारा पहुँचा जा सकता है मिल उनके माध्यम से, $array["207"] जैसी सीधी पहुंच हमेशाहोगीसे $array[207], जो मौजूद नहीं है।

जब से तुम json_decode() से ऊपर की तरह

$json = '{"207":"sdf", "210":"sdf"}' 

सबसे अच्छा समाधान पहली जगह में संख्यात्मक कुंजियों से बचने के लिए होगा एक स्ट्रिंग के लिए लागू की तरह एक वस्तु हो रही है। ये शायद ऑब्जेक्ट की श्रृंखला के संख्यात्मक गुण के रूप में बेहतर मॉडलिंग कर रहे हैं:

  1. बेहतर मूल डेटा को दर्शाता है, वस्तुओं का संग्रह के रूप में:

    $json = '[{"numAttr":207, "strAttr":"sdf"}, {"numAttr":210, "strAttr":"sdf"}]' 
    

    इस डेटा संरचना वर्तमान से अधिक के कई फायदे हैं जो एक संख्यात्मक संपत्ति

  2. यह अन्य गुणों के साथ आसानी से एक्स्टेंसिबल है
  3. यह विभिन्न प्रणालियों भर में अधिक पोर्टेबल है (जैसा कि आप देख, अपने वर्तमान डेटा struc ट्यूर PHP में समस्याएं पैदा कर रहा है, लेकिन यदि आप किसी अन्य भाषा का उपयोग करना चाहते हैं तो आप आसानी से इसी तरह के मुद्दों का सामना कर सकते हैं)।

एक संपत्ति → वस्तु नक्शा आवश्यक है, इसे जल्दी प्राप्त किया जा सकता है, उदा, इस तरह:

function getNumAttr($obj) { return $obj->numAttr; } // for backward compatibility 
$arr = json_decode($json); // where $json = '[{"numAttr":... 
$map = array_combine(array_map('getNumAttr', $arr), $arr); 

अन्य समाधान के रूप में ascii-चूने का सुझाव दिया करने के लिए होगा: वस्तुओं के बजाय उत्पादन साहचर्य सरणियों करने के लिए बल json_decode(), true करने के लिए अपने दूसरा पैरामीटर की स्थापना द्वारा:

$map = json_decode($json, true); 

के लिए आपका इनपुट डेटा यह सीधे उत्पन्न करता है

array(2) { 
    [207]=> 
    string(3) "sdf" 
    [210]=> 
    string(3) "sdf" 
} 

ध्यान दें कि सरणी की कुंजी अब स्ट्रिंग के बजाय पूर्णांक हैं।

मैं जेएसओएन डेटा संरचना को एक बहुत साफ समाधान बदलने पर विचार करता हूं, हालांकि, हालांकि मैं समझता हूं कि ऐसा करना संभव नहीं है।

+0

यह मजाकिया हो रहा है और फिर कुछ समय बाद अपरिवर्तित है। अगर मेरे उत्तर में कुछ गलत पता चला है, तो मुझे यह जानकर उत्सुकता होगी कि यह –

+0

क्या है या क्या यह मैनुअल के लापता लिंक था? अब वे वहां हैं ... –

0

मेरे दृष्टिकोण का उपयोग का प्रयास करें:

class ObjectToArray { 
    public static function convert($object) { 
     if(!is_object($object) && !is_array($object)) { 
      return $object; 
     } 

     if(is_object($object)) { 
      $object = get_object_vars($object); 
     } 

     return array_map('ObjectToArray::convert', $object); 
    } 
} 

$aNewArray = ObjectToArray::convert($oYourObject); 
0

बस डाल error_reporting (0); आप में विधि या फ़ाइल की शुरुआत में। यह आपकी समस्या हल करेगा।

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