2011-07-04 56 views
41

你怎麼可以很容易地避免收到此錯誤/通知:如何避免不確定的偏移

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

...在此代碼:

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

有並不總是爆炸返回兩個值,但是如果你想使用list(),那麼你怎樣才能輕鬆地避免這個通知?

回答

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

兩個變化:

  • 它限制了explode()返回的數組的大小,這一點似乎,沒有比這更多的是想
  • 如果有返回少於兩個值它附加null,直到數組包含2個值。見Manual: array_pad()進一步的信息

這意味着,如果在$value沒有|$field === null。當然,您可以使用您想要定義的每個值作爲默認值$field(而不是null)。它也可以交換的$func行爲和$field

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

現在$funcnull,當在$value沒有|

1

當你試圖用($value)爆炸字符串的東西實際上沒有它時,你會得到一個undefined offset,我相信。

這個問題與此非常相似: undefined offset when using php explode(),其中有一個更完善的解釋應該完全解決您的問題。

至於檢查'|'的發生,至於防止錯誤,你可以這樣做:

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

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

希望這會有所幫助。

+0

@Down選民你會介意解釋爲什麼?如果我犯了一個錯誤,如果你能解釋爲什麼我可以糾正錯誤,並且從錯誤的地方學習,我就沒有問題了。乾杯。 –

+0

即使'strpos'返回'true',你仍然可以得到錯誤。 '$ value ='almost | perfect'; $ pos = strpos($ value,'|'); if($ pos === true){list($ one,$ two,$ three)= explode('|',$ value); }' –

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; 

有可能是一個更快,更簡潔的方式,雖然。

+0

雖然這會使'$ field'未定義,這比未定義的索引好得多。 – phant0m

+0

是的你是對的。我已經添加了一行來將它設置爲NULL,以防之前的定義。但無論如何,我想你在使用它之前要檢查$ field的值。 –

8

我不知道的一個直接的方式來做到這一點,也保留了

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

方便不過,因爲它實在是一種遺憾是能夠做到這一點,你可能要考慮偷偷摸摸間接的方法:

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

需要確保explode會產生在陣列中至少2項我已經追加到$value許多|秒。對於n變量,請添加n-1分隔符。

這樣你不會得到任何錯誤,你保留方便的list賦值,並且輸入中不存在的任何值將被設置爲空字符串。對於大多數情況下,後者不應該給你任何問題,所以上述想法將起作用。

+0

如果是關於'不顯示'的通知,我們不能通過執行@explode()來壓制它嗎?我知道這不太好,但它的確有訣竅嗎?如果你真的想'避免'它,那麼你是絕對正確的... – KilZone

+3

@KilZone:它不是真的關於「不顯示」它,而是在「這段代碼的寫法,如果它曾經給出錯誤,它已經獲得了一個錯誤「。而且,儘可能避免使用'@'運算符。您在運營商的文檔中知道[警告](http://php.net/manual/en/language.operators.errorcontrol.php)?我已經不止一次地摔倒了。 – Jon

+0

對,我可以看到你的(和克拉克的)觀點,我只是想知道。噢,是的,我知道這個警告,這不是我第一次盯着我的頁面應該出現的空白屏幕。 – KilZone

-1

這爲我工作:

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

抑制錯誤,從來不是好事! – bart

+0

我同意你@bart。在大多數情況下都是如此,但在這種特殊情況下,我看不到一個主要問題不要使用它。 – Delmo

0

我經常遇到這個問題,所以我想這句法更好的東西讓沒有不必要的填充數組或字符串的函數。

// 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或以上爲可變功能: http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list