2011-07-04 17 views
41

कैसे आप आसानी से इस त्रुटि/नोटिस होने से बचने कर सकते हैं:कैसे से बचने के लिए अपरिभाषित ऑफसेट

Notice: Undefined offset: 1 in /var/www/page.php on line 149 

... इस कोड में:

list($func, $field) = explode('|', $value); 

वहाँ हमेशा विस्फोट द्वारा लौटाए गए दो मानों नहीं हैं, लेकिन अगर आप सूची का उपयोग करना चाहते हैं() तो आप आसानी से नोटिस से कैसे बच सकते हैं?

उत्तर

93
list($func, $field) = array_pad(explode('|', $value, 2), 2, null); 

दो परिवर्तन:

  • यह 2. ऐसा लगता है के लिए सरणी explode() द्वारा लौटाए के आकार को सीमित, कि इस से अधिक नहीं चाहता था है
  • लौटे दो से कम मूल्यों देखते हैं तो , इसमें null संलग्न होता है जब तक सरणी में 2 मान होते हैं।,, $field === null अधिक जानकारी के

इसका मतलब यह है के लिए Manual: array_pad() देखें अगर वहाँ $value में कोई |। बेशक आप $field (null के बजाय) के रूप में परिभाषित करने के लिए इच्छित प्रत्येक मान का उपयोग कर सकते हैं। इसकी भी संभव $func के व्यवहार और $field

list($func, $field) = array_pad(explode('|', $value, 2), -2, null); 

अब $funcnull है स्वैप करने के लिए, जब वहाँ $value में कोई |

1

आपको undefined offset मिलता है जब आप जिस चीज को स्ट्रिंग को विस्फोट करने की कोशिश कर रहे हैं ($value) वास्तव में इसमें नहीं है, मुझे विश्वास है।

यह प्रश्न बहुत समान है: undefined offset when using php explode(), जहां एक और आगे स्पष्टीकरण है जो आपकी समस्या को पूरी तरह से हल करना चाहिए।

'|' की घटना की जांच के लिए त्रुटि को रोकने के लिए, आप कर सकते हैं:

$pos = strpos($value,'|'); 

if(!($pos === false)) { 
    //$value does contain at least one | 
} 

आशा है कि इससे मदद मिलती है।

+0

@Down मतदाता तुम क्यों समझा मन होगा? अगर मुझे कोई त्रुटि हुई है, तो मुझे डाउनवॉट होने में कोई समस्या नहीं है, अगर आप यह समझा सकते हैं कि मैं पोस्ट को सही क्यों कर सकता हूं और यह भी सीख सकता हूं कि मैं कहां गलत हो गया हूं! चीयर्स। –

+0

आप अभी भी त्रुटि प्राप्त कर सकते हैं भले ही 'स्ट्रॉप्स' रिटर्न 'सत्य' हो। '$ मूल्य = 'लगभग | सही'; $ pos = strpos ($ value, '|'); अगर ($ pos === सत्य) {सूची ($ एक, $ दो, $ तीन) = विस्फोट ('|', $ मान); } ' –

0
if (count(explode('|', $value))==2) 
    list($func, $field) = explode('|', $value); 

हालांकि यह थोड़ा अनुकूल नहीं है।

+1

दो बार विस्फोट? क्यों न सिर्फ एक पाइप चरित्र है, तो विस्फोट? –

0

मैं शायद यह दो चरणों

$split = explode('|', $value); 
$func = $split[0]; 
if(count($split) > 1) 
    $field = $split[1]; 
else 
    $field = NULL; 

में टूट चाहते हैं वहाँ शायद एक तेज और neater तरीका हालांकि है।

+0

हालांकि यह '$ फ़ील्ड 'को अपरिभाषित छोड़ देगा, जो कि एक अपरिभाषित अनुक्रमणिका से शायद ही बेहतर है। – phant0m

+0

हाँ आप सही हैं। यदि इसे पहले परिभाषित किया गया है तो मैंने इसे NULL पर सेट करने के लिए एक पंक्ति जोड़ा है। लेकिन किसी भी मामले में, मुझे लगता है कि आप इसका उपयोग करने से पहले $ फ़ील्ड के मूल्य की जांच करना चाहते हैं। –

8

मैं, यह करने के लिए एक सीधा रास्ता है कि यह भी

list($func, $field) = explode('|', $value); 

की सुविधा को बरकरार रखता है हालांकि की नहीं जानता कि यह वास्तव में एक दया नहीं यह करने के लिए सक्षम होने के लिए है, क्योंकि, आप कर सकते हैं एक डरपोक परोक्ष दृष्टिकोण पर विचार करें:

list($func, $field) = explode('|', $value.'|'); 

के रूप में यह सुनिश्चित करें कि explode सरणी में कम से कम 2 वस्तुओं का उत्पादन होगा बनाने के लिए आवश्यक मैं $value के रूप में कई | रों के साथ जोड़ दिया है। n चर के लिए, n-1 डिलीमीटर वर्ण जोड़ें।

इस तरह आपको कोई त्रुटि नहीं मिलेगी, आप सुविधाजनक list असाइनमेंट रखते हैं, और इनपुट में मौजूद कोई भी मान खाली स्ट्रिंग पर सेट नहीं किया जाएगा। अधिकांश मामलों के लिए, उत्तरार्द्ध को आपको कोई समस्या नहीं देनी चाहिए ताकि उपरोक्त विचार काम करेगा।

+0

यदि यह नोटिस 'दिखा नहीं रहा' है, तो क्या हम इसे @explode() करके बस दबा सकते हैं? मुझे पता है कि यह सुंदर नहीं है, लेकिन यह चाल सही है? यदि आप वास्तव में इसे 'टालना' चाहते हैं, तो आप बिल्कुल सही हैं ... – KilZone

+3

@ किलज़ोन: यह वास्तव में "दिखाना नहीं" के बारे में नहीं है, बल्कि इसकी मानसिकता में "यह कोड लिखा गया है कि अगर यह कभी भी लिखा गया है एक त्रुटि देता है, यह एक बग हासिल किया है "। साथ ही, यदि संभव हो तो '@' ऑपरेटर को सबसे अच्छी तरह से बचाया जाता है। आप ऑपरेटर के प्रलेखन में [उस चेतावनी] (http://php.net/manual/en/language.operators.errorcontrol.php) जानते हैं? मैं एक बार से अधिक के लिए गिर गया है। – Jon

+0

ठीक है, मैं आपका (और क्लर्क) बिंदु देख सकता हूं, मैं वैसे भी सोच रहा था। ओह और हाँ मुझे यह चेतावनी पता है, यह पहली बार नहीं होगा जब मैं एक खाली स्क्रीन पर देख रहा था जहां मेरा पृष्ठ होना चाहिए था। – KilZone

-1

यह मेरे लिए काम किया:

@list($func, $field) = explode('|', $value); 
+0

त्रुटियों को दबाकर, कभी भी अच्छी बात नहीं! – bart

+0

मैं आपके साथ @ बार्ट से सहमत हूं। यह ज्यादातर मामलों में सच है लेकिन इस विशिष्ट मामले में मुझे उपयोग करने के लिए कोई बड़ी समस्या नहीं दिखाई दे रही है यह। – Delmo

0

मैं अक्सर इस समस्या का सामना करते हैं, इसलिए मैं एक समारोह है कि कुछ अनावश्यक सरणी या स्ट्रिंग padding बिना अच्छे वाक्य रचना की अनुमति चाहता था।

// Put array entries in variables. Undefined index defaults to null 
function toVars($arr, &...$ret) 
{ 
    $n = count($arr); 
    foreach ($ret as $i => &$r) { 
     $r = $i < $n ? $arr[$i] : null; 
    } 
} 

// Example usage 
toVars(explode('|', $value), $func, $field); 

मेरी प्रयोजनों के लिए, मैं आमतौर पर एक सरणी के साथ काम कर रहा हूँ, लेकिन आप एक समान कार्य विस्फोट समारोह, इस तरह शामिल है कि ... लिख सकता है

// Explode and put entries in variables. Undefined index defaults to null 
function explodeTo($delimiter, $s, &...$ret) 
{ 
    $arr = explode($delimier, $s); 
    $n = count($arr); 
    foreach ($ret as $i => &$r) { 
     $r = $i < $n ? $arr[$i] : null; 
    } 
} 

// Example usage 
toVars('|', $value, $func, $field); 

PHP5.6 आवश्यक है या variadic समारोह के लिए ऊपर: http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list

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