2012-06-07 100 views
2

我有這樣的代碼:通過遍歷CSV文件在PHP

<?php 
    $handle = fopen("GeneratePicklist.csv", "r"); 
    $data = fgetcsv($handle, 5000, ","); 
?> 

開闢了一個PHP文件,並將其轉換成PHP數組。然後我將列出數組內容並將其顯示爲格式化的頁面。我有這個代碼,它的工作。

<?php 
    echo "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"> 
     <tr> 
      <td class=\"dataHeader\" width=\"100\">Mat.Loc.</td> 
      <td class=\"dataHeader\" width=\"20\">Qty</td> 
      <td class=\"dataHeader\">Description</td> 
      <td class=\"dataHeader\" width=\"150\">Part Number</td> 
      <td class=\"dataHeader\" width=\"30\">Multiplier</td> 
      <td class=\"dataHeader\" width=\"80\">Total Qty</td> 
     </tr> 
"; 
$locatePartNoString = array_search("Part Number",$data); 
$arrayStart = $locatePartNoString-1; 
end($data); 
$lastField = key($data); 
$counter = ($lastField - $arrayStart); 
$arrayBegin = $locatePartNoString+6; 
while($counter>0) { 
    echo " 
     <tr> 
      <td class=\"centered\"><span class=\"title\">*".$data[$arrayBegin+4]."*</span><br>".$data[$arrayBegin+4]."</td> 
      <td id=\"qty".$counter."\" class=\"centered\">".$data[$arrayBegin+1]."</td> 
      <td>".$data[$arrayBegin+2]."</td> 
      <td class=\"centered\">".$data[$arrayBegin]."</td> 
      <td class=\"centered\"><input type=\"text\" id=\"multiplier".$counter."\" name=\"multiplier".$counter."\" value=\"1\" size=\"3\" style=\"border:1px dotted #CCC;\"></td> 
      <td class=\"centered\"><input type=\"text\" id=\"total".$counter."\" name=\"total".$counter."\" value=\"1\" size=\"3\" style=\"border:1px dotted #CCC;\"></td> 
     </tr> 

    "; 
    $counter--; 
} 
echo "</table>"; 
?> 

我所試圖做的是通過CSV文件中的橫向和僅在$arrayBegin變量的覆蓋面和我的CSV數據的最後部分選擇特定的數據。我已經完成了第一行和它的工作,但我不知道如何增加,所以我的指針移動到了CSV文件的下一行,並執行與我的第一行數據相同的公式。

這裏的CSV內容的樣品,7個領域:

ÊÊ,Part Number,Qty,Description,BB Type,Material Location,Serial Number 
ÊÊ,013224-001,1,"PCA,DDR2-800,MINIDIMM MOD256MBx 40",BOM,ASSY,ID121608ZS 
ÊÊ,122657-00A,1,SOFTWARE TEST (US M3 CTO),BOM,ASSY, 
ÊÊ,376383-002,8,"ASSY, BLANK,SFF",BOM,ASSY, 
ÊÊ,458943-003,1,"CA ASSY, SFP BATTERY, 15 POS, 28AWG, 24",BOM,ASSY, 
ÊÊ,460499-001,1,"ASSY, 4/V650HT BATTERY CHARGER MODULE",BOM,ASSY, 
ÊÊ,499256-001,2,"ASSY, BLANK,MEDIA BAY,ML350G6",BOM,ASSY, 
ÊÊ,500203-061,2,"DIMM,4GB PC3-10600R,256Mx4,RoHS",BOM,ASSY,RAKWF8DXV2Q100 

我只需要選擇每行的某些數據,然後移動到下一行。我如何使用while循環遍歷下一行?感謝您的未來回應。

+1

使用for循環或foreach循環,而不是一個while循環。 –

+1

或在while循環中移動您的搜索 – Oliver

+0

@arxanas,感謝評論,但我真的不知道該怎麼做。我剛剛開始PHP。 – JudeJitsu

回答

7

這通常是你如何去通過一個CSV文件,從你所擁有的已經:

$handle = fopen("GeneratePicklist.csv", "r"); 
$firstRow = fgetcsv($handle, 5000, ","); 
$partNumberPosition = array_search("Part Number", $firstRow, true); 

在這點你已經讀了第一行,通常包含字段名稱。您還確定'零件號碼'在哪一列。

而獲取的其餘部分:

// the function `fgetcsv()` will return `false` when the end-of-file is reached 
while (false !== ($row = fgetcsv($handle, 5000))) { 
    // we have read a(nother) row of data 
    // if you're not interested in the columns before the 'Part Number' 
    // you can slice them off 
    $row = array_slice($row, $partNumberPosition); 
    // at this point, $row contains: 
    // 0 => the part number 
    // 1 => the quantity 
    // etc... 
} 
// we're done, close the file 
fclose($handle); 
+0

謝謝傑克!但是,如果我從CSV文件的開始處開始遍歷,這將起作用,事實並非如此,因爲CSV文件實際上是不同數據的集合,我只是試圖從其中找到值「 Part Number「然後從那裏開始。是否有可能使用你的代碼來做到這一點? – JudeJitsu

+0

@JudeJitsu你的意思是你只對從零件號開始的列感興趣?我編輯了我的答案 –

+0

是的,我只對這些列感興趣。謝謝! – JudeJitsu

2

在您解析或在while循環的解析過程中,您可以測試條件。 (這是一個類方法,我寫了這麼無視類的東西:))

private function logicMakeCSVTable(){ 

    $this->importData = Array(); 
     $i = 0; 
     while($row = fgetcsv($this->handle, 999999, ",")){ 

      $num = count($row); 
      for($c=0; $c < $num; $c++){ 

       $this->importData[$i][$c] = $row[$c]; 
      } 

      $i++; 
     } 

     $_SESSION['ImportData'] = ""; 
     $_SESSION['ImportData'] = $this->importData; 

} 
+0

謝謝Alex。讓我先研究一下,因爲這對我來說已經非常先進了:D哈哈......我該如何將它應用於我的代碼? – JudeJitsu

+0

您的CSV文件在while($ row = fgetcsv($ handle,999999,「,」))中循環您首先要做的是請求數組的行數。然後在For語句中循環遍歷For語句的每一行。你最終得到的是一個帶有$ importData [ROW] [COLUMN]的二維數組然後你可以直接調用(第1行第5列)$ importData [1] [5] –

+0

謝謝Alex!將消化這:) :) – JudeJitsu