2012-11-15 124 views
0

我有一個csv文件,我試圖變成一個不同的結構化數組。首先,我把它變成一個數組命名all_data()這樣的構造:PHP的錯誤:在foreach循環內未定義的偏移量錯誤

$data = file_get_contents($id . '.csv'); 
     $data_array = explode("\n", $data); 
     foreach($data_array AS $data){ 
      $all_data[] = explode("\t", $data); 
     } 

結果是這樣的:

array(5) { 
     [0]=> 
     array(2) { 
     [0]=> 
     string(10) "2012-11-14" 
     [1]=> 
     string(2) "10" 
     } 
     [1]=> 
     array(2) { 
     [0]=> 
     string(10) "2012-11-14" 
     [1]=> 
     string(2) "10" 
     } 
     [2]=> 
     array(2) { 
     [0]=> 
     string(10) "2012-11-14" 
     [1]=> 
     string(2) "10" 
     } 
     [3]=> 
     array(2) { 
     [0]=> 
     string(10) "2012-11-14" 
     [1]=> 
     string(2) "10" 
     } 

     [4]=> 
     array(1) { 
     [0]=> 
     string(0) "" 
     } 

} 

然後,我把它變成im_arr()用下面的代碼:

foreach($all_data as $key => $value){ 
      $im_arr[$key][$value[0]] = $value[1]; 
     } 

結果:

array(5) { 
    [0]=> 
    array(1) { 
    ["2012-11-14"]=> 
    string(2) "10" 
    } 
    [1]=> 
    array(1) { 
    ["2012-11-14"]=> 
    string(2) "10" 
    } 
    [2]=> 
    array(1) { 
    ["2012-11-14"]=> 
    string(2) "10" 
    } 
    [3]=> 
    array(1) { 
    ["2012-11-14"]=> 
    string(2) "10" 
    } 

    [4]=> 
    array(1) { 
    [""]=> 
    NULL 
    } 
} 

然後,終於另一個foreach循環給我,結果我要找:

foreach ($im_arr as $val) { 
    foreach ($val as $key => $val2) { 
     $im_data[$key]=$val2; 
    } 
     } 

有了結果爲im_data()是:

array(2) { 
    ["2012-11-14"]=> 
    string(2) "10" 
    [""]=> 
    NULL 
} 

這將是完美的,因爲數組im_data( )正是我想要從all_data()中解脫出來的。但是,當我試圖將此代碼放在程序的另一部分中時,它不起作用,我認爲這可能是因爲我收到了警告:

「PHP Notice:Undefined offset:1 in。 .. 93" 行

93號線對應於這一行:

$im_arr[$key][$value[0]] = $value[1]; 

這裏是代碼的完整部分:

$all_data = array(); 
    $im_arr=array(); 

$data = file_get_contents($id . '.csv'); 
     $data_array = explode("\n", $data); 
     foreach($data_array AS $data){ 
      $all_data[] = explode("\t", $data); 
     } 

     foreach($all_data as $key => $value){ 
      $im_arr[$key][$value[0]] = $value[1]; //the line for the error 
     } 
    $im_data=array(); 

foreach ($im_arr as $val) { 
    foreach ($val as $key => $val2) { 
     $im_data[$key]=$val2; 
    } 
     } 




var_dump($im_data); 

我知道有很多很多問題p osted爲同樣的錯誤,但我無法弄清楚這個特定的代碼的問題。

+0

在向其添加密鑰之前創建子數組。 'if(!array_key_exists($ key,$ im_arr)){$ im_arr [$ key] = array(); ''。或者MarcB說,你的一些價值觀的格式不正確。 – DCoder

+1

你的文件中至少有一行沒有'\ t',給你至少有一個沒有'1'索引的$ all_data條目。 –

+0

這很有道理,但我仍然得到相同的錯誤通知。 – midde

回答

2

這就是問題所在:

[4]=> 
    array(1) { 
    [0]=> 
    string(0) "" 
    } 

只是檢查數據設置,而不是空將它們添加到$im_arr前:

foreach ($all_data as $key => $value) { 
    if (isset($value[0]) && isset($value[1]) && !empty($value[0]) && !empty($value[1])) { 
    $im_arr[$key][$value[0]] = $value[1]; 
    } 
} 
0

對於每一個的foreach我會預先檢查如果第一個參數是數組

例如;

//Just add line below for every foreach (and add any required else statement if needed) 
if(is_array($im_arr)) 
foreach ($im_arr as $val) { 
    if(is_array($val)) 
    foreach ($val as $key => $val2) { 
     $im_data[$key]=$val2; 
    } 
}