[英]warning: fputcsv() expects parameter 2 to be array, boolean. when writing to new csv file. php
我有一個名為employee_data.csv的CSV文件。 它包含格式如下的員工記錄:
JANE WILLIAMS,6/8/1998,55846874E,4323
PETER JONES,15/01/1982,56897547Q,1234
JAMES O'BRIEN,09/05/2001,25689514W,3432
我想刪除csv文件中的選定行。 為此,我將要將不想刪除的csv文件中的2行簡單復制到new_employee_data.csv文件中,然后刪除舊行。
<?php
$dataSrc = "persistence/employee_data.csv";
$dataDest = "persistence/new_employee_data.csv";
$dataFile = fopen($dataSrc, "r") or die("Unable to open file!");
$outFile = fopen($dataDest, "w") or die("Unable to open file!");
$i=0; //index for the array
while(!feof($dataFile)) {
$csv = fgetcsv($dataFile); //read a line from the CSV file
//$csv = [ANE WILLIAMS,6/8/1998,55846874E,4323];
//add check to remove row
print_r($csv);
if($csv[2] == '55846874E') continue; //skip to next itteration
fputcsv($outFile, $csv);
}
fclose($dataFile);
fclose($outFile);
?>
上面的代碼獲取$dataFile
的內容,並將其$outFile
寫入$outFile
,如果第三列='55846874E',它將跳過寫該行。 csv數組包含employee_data.csv文件中的行。
$ csv數組中的元素如下。
Array ( [0] => JANE WILLIAMS [1] => 6/8/1998 [2] => 55846874E [3] => 4321 )
Array ( [0] => PETER JONES [1] => 15/01/1982 [2] => 56897547Q [3] => 1234 )
Array ( [0] => JAMES O'BRIEN [1] => 09/05/2001 [2] => 25689514W [3] => 8475 )
它將刪除文件的第一行JANE WILLIAMS,6/8/1998,55846874E,4323
現在,在new_employee_data.csv中是兩個未刪除的記錄。
"PETER JONES",15/01/1982,56897547Q,1234
"JAMES O'BRIEN",09/05/2001,25689514W,8475
這正是我想要的操作,但是在瀏覽器中運行時收到以下警告:
fputcsv()期望參數2為數組,第25行給出布爾值
fputcsv($outFile, $csv);
而且我不知道為什么,關於如何解決此問題的任何建議?
我會改變while循環所以
while(!feof($dataFile)) {
$csv = fgetcsv($dataFile);
像這樣
while(false !== ($csv = fgetcsv($dataFile))){
您可以在PHP網站上查看此用法的示例
可能發生的情況是,文件末尾有一個額外的return
,因此feof
不會捕獲該返回值,然后您將fgetcsv
布爾值設置為false
。 例如這樣的例子(其中\\ n是新行):
JANE WILLIAMS,6/8/1998,55846874E,4323\n
PETER JONES,15/01/1982,56897547Q,1234\n
JAMES O'BRIEN,09/05/2001,25689514W,3432\n
\n
\eof
因此,我們可以將它們組合在一起(這樣就不會在while循環下需要該行),而只需從執行循環條件的同一位置獲取數據,這樣,當它返回false時,它將刪除循環。 請務必注意其中的=
數量,因為單個是賦值,而!==
是嚴格的類型比較。 因此,我們可以將其分解為一點,然后用英語怎么說。
fgetcsv($dataFile)
的結果, fgetcsv($dataFile)
true,否則為false 。 基本上像這樣工作
while($csv = fgetcsv($dataFile)){
我傾向於喜歡長手版本,因為更容易看出我們正在分配而不是進行比較。 例如,您可以瀏覽上面的版本,然后認為它應該是==
而不是=
因此第一個版本只會使它更加明顯。 出於相同的原因,將false
放在左側基本上是出於相同的原因(並且由於其本質上是一個常數,因此將其放在左側可以避免出現以下錯誤,例如false = $csv
無法工作)。
實際上,將=
錯放到條件中可能是較難發現的錯誤之一,因為這是完全合法的。 因此,進行比較時,將函數調用和常量放在左側是一種“技巧”。
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.