2013-07-03 36 views
39

時1陣列:PHP的通知:閱讀我得到這個PHP錯誤數據

PHP Notice: Undefined offset: 1 

這裏是PHP代碼,拋出它:

$file_handle = fopen($path."/Summary/data.txt","r"); //open text file 
$data = array(); // create new array map 

while (!feof($file_handle)) { 
    $line_of_text = fgets($file_handle); // read in each line 
    $parts = array_map('trim', explode(':', $line_of_text, 2)); 
    // separates line_of_text by ':' trim strings for extra space 
    $data[$parts[0]] = $parts[1]; 
    // map the resulting parts into array 
    //$results('NAME_BEFORE_:') = VALUE_AFTER_: 
} 

這個錯誤是什麼意思不確定的偏移?什麼導致這個錯誤?

+1

你是如何確定文件中的每一行都有冒號? – andrewsi

+0

做'var_dump($ parts)'。你可能會發現,你得到那個未定義的偏移量,零件數組中沒有'1'鍵。 –

+2

如果看起來所有行都有冒號,請檢查空行。 – Barmar

回答

76

變化

$data[$parts[0]] = $parts[1]; 

if (! isset($parts[1])) { 
    $parts[1] = null; 
} 

$data[$parts[0]] = $parts[1]; 

或者乾脆:

$data[$parts[0]] = isset($parts[1]) ? $parts[1] : null; 

不是你的文件的每一行中有一個冒號,因此爆炸對返回數組尺寸1.

php.net possible return values from explode

Returns an array of strings created by splitting the string parameter on boundaries formed by the delimiter.

If delimiter is an empty string (""), explode() will return FALSE. If delimiter contains a value that is not contained in string and a negative limit is used, then an empty array will be returned, otherwise an array containing string will be returned.

+0

感謝GGio!很好的解釋,非常清楚。 – alchuang

+0

它的工作原理。謝謝 –

1

這是一個「PHP的通知」,所以理論上你可以忽略它。更改php.ini

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 

error_reporting = E_ALL & ~E_NOTICE 

這顯示所有的錯誤,除了提醒。

17

如何重現上述錯誤在PHP中:

php> $yarr = array(3 => 'c', 4 => 'd'); 

php> echo $yarr[4]; 
d 

php> echo $yarr[1]; 
PHP Notice: Undefined offset: 1 in 
/usr/local/lib/python2.7/dist-packages/phpsh/phpsh.php(578) : 
eval()'d code on line 1 

是什麼錯誤訊息?

這意味着編譯PHP尋找關鍵1跑散反對,並沒有發現任何與之相關的值,然後說Undefined offset: 1

如何作出這樣的錯誤會消失嗎?

詢問陣列如果密鑰這樣的返回值之前存在:

php> echo array_key_exists(1, $yarr); 

php> echo array_key_exists(4, $yarr); 
1 

如果陣列中不包含你的鑰匙,不問其價值。雖然這個解決方案使你的程序雙重工作,「檢查它是否存在」,然後「去得到它」。

替代解決方案的速度更快:

如果得到一個丟失的鑰匙是由錯誤的特殊情況下,它的速度更快,只是得到的值(如在echo $yarr[1];)和catch是偏移誤差和處理它像這樣:https://stackoverflow.com/a/5373824/445131

-5

你也可以嘗試刪除警告...

error_reporting=0 
0

我剛剛過這個問題,我甚至不認爲這是我的打字錯誤:

Array("Semester has been set as active!", true) 
Array("Failed to set semester as active!". false) 

而且居然有人!我只是不小心輸入了「.」而不是「,」...