簡體   English   中英

警告:fputcsv()期望參數2為數組,布爾值。 寫入新的csv文件時。 的PHP

[英]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對其進行處理,將$ csv設置為其值,括號優先
  • 如果$ csv為布爾值false,則循環條件為false並結束。 因此,基本上, 如果false(boolean)不等於fgetcsv($dataFile)的結果, fgetcsv($dataFile) true,否則為false

基本上像這樣工作

while($csv = fgetcsv($dataFile)){

我傾向於喜歡長手版本,因為更容易看出我們正在分配而不是進行比較。 例如,您可以瀏覽上面的版本,然后認為它應該是==而不是=因此第一個版本只會使它更加明顯。 出於相同的原因,將false放在左側基本上是出於相同的原因(並且由於其本質上是一個常數,因此將其放在左側可以避免出現以下錯誤,例如false = $csv無法工作)。

實際上,將=錯放到條件中可能是較難發現的錯誤之一,因為這是完全合法的。 因此,進行比較時,將函數調用和常量放在左側是一種“技巧”。

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM