2011-03-23 165 views
4

看起來這可能是一個處理數組的錯誤,但我無法弄清楚。我真的只是從PHP開始,這有點嚇人。 任何幫助將不勝感激!這裏是我的代碼:PHP錯誤:未定義偏移量:1

<?php echo "<h1>Choose a Poll!</h1>"; 

$read = file('poll_topics.txt'); 
$data = array();   
foreach($read as $lines){   
    list($key,$v) = explode("|","$lines");   
    $data[$key] = $v; 
} 

foreach ($data as $k=>$desc){    
    echo "<ul><li><a href='take_a_poll.php?poll=$k'>$k</a> - $desc </li></ul>"; 
} 

?> 

下面是在文本文件中:

Instruments|What kind of instruments do you like? 
    Music|What type of music do you like best? 

我要澄清: 誤差爲20行,或者在那裏說:list($key,$v) = explode...

+0

爲什麼$行像「$ lines」?引用我的意思。你沒有嘗試過嗎? – 2018-01-31 04:02:13

回答

4

你有某處有空行。這就是爲什麼explode()將只返回一個空的$鍵,但沒有分配給$ v的東西。那就是當它打印該通知時。

你可以把它改寫有點忽略這樣的情況:

foreach ($read as $lines) { 
    $key = strtok($lines, "|"); 
    $v = strtok("|"); 
    if ($v) { 
     $data[$key] = $v; 
    } 
} 

這也將避免您的最終$數據數組中的空項。

+0

不幸的是,我必須使用explode()函數,但是感謝替代! – eightonrose 2011-03-23 03:01:23

+1

這很不幸。即使fgetcsv在這裏也是一個更好的功能。但是如果你想要一個懶惰的替代方法:'@list($ key,$ v)= explode()'會抑制通知。在任何情況下您都必須執行'if($ v)'檢查。 – mario 2011-03-23 03:05:05

+0

謝謝你的提問,但它還沒有工作。我輸入了0個參數,它給了我3個可怕的錯誤。不管它是什麼,錯誤都集中在「list($ key,$ v)= explode(」|「,」$ lines「);」 – eightonrose 2011-03-23 03:09:47

2

試試這個:

<?php 

echo "<h1>Choose a Poll!</h1>"; 
$_fileData = file_get_contents('poll_topics.txt'); 
$_results = array(); 

if (! empty($_fileData)) 
{ 
    foreach ($_fileData as $_line) 
    { 
     $_split = explode('|', $_line); 

     // Many ways to do this: 
     // if (!empty($_split) && 2 == count($_split)) then no error else error 
     // or... 
     if (isset($_split[0], $_split[1] )) 
     { 
      $_key = $_split[0]; 
      $_value = $_split[1]; 

      if (null !== $_key && null !== $_value) 
      { 
       $_results[ $_key ] = $_value; 
        // or $_results[] = array($_key => $_value); if key can be duplicated 
      } 

     } 
    } 
} 
+0

我得到了:警告:爲foreach提供了無效的參數 – eightonrose 2011-03-23 03:03:19

+0

檢查file_get_contents的返回值很可能它不能讀取文件,因此給它一個絕對路徑確保該文件不是空的,並在你的PHP腳本所在的目錄中。另外,檢查$ _fileData的返回值。我會修改代碼來向你展示。 – lucifurious 2011-03-23 03:47:58

0

你可以嘗試使用array_pad()功能。 在寫爆炸功能的地方使用它。

$_split = array_pad(explode('|', $_line), numberOfElementsInArray, null);