【问题标题】:fgetcsv() returns "true" for each linefgetcsv() 为每一行返回“true”
【发布时间】:2014-01-22 19:56:38
【问题描述】:

我遇到了 php fgetcsv() 方法的问题。我只能得到值“1”而不是每行的数组。代码如下:

$row = 0;
$teststring='';
$handle = fopen($savepath,'r');
if($handle!==FALSE){
    while(($data = fgetcsv($handle,2000,'|')!==FALSE)){        //I am using '|' as the delimiter
        echo (string)$data;
        if($row!=0){
            foreach($data as $d){
                array_push($result['added'],$d);
            }
        }
        $row++;
    }
    fclose($handle);
}

我测试了一个 3 行的 csv 文件,结果将是“111”。当然,数组 $result['add'] 中没有任何值。有没有人知道发生了什么?谢谢。

【问题讨论】:

  • 我敢打赌!== 会首先评估,结果将进入$data...
  • 嘿,你是对的!那是个很好的观点。非常感谢!

标签: php fgetcsv


【解决方案1】:

操作顺序!

while(($data = fgetcsv($handle,2000,'|')!==FALSE)){

PHP 将这一行解释为:

  • 致电fgetcsv
  • 不进行强制转换,将其与布尔值false 进行比较
  • 将此比较的结果分配给$data

这不是你想要的。你的括号放错了位置,你想要最后一个比较之前:

while( ($data = fgetcsv($handle,2000,'|')) !== FALSE ){

我添加了额外的空格以使更改更加明显。

【讨论】:

  • 尽管您的解释是正确的以及 PHP 是如何工作的,但 PHP 语法实际上误导了操作顺序,并且与 PHP 的其他调用的工作方式不一致:语法建议操作顺序是fgetcsv,将其分配给$data,并使用该值按照while 关键字的指示评估布尔值 - 就像一个不是布尔值的实际变量如何被评估为布尔值但不会改变一样。 PHP 是垃圾的另一个原因 - 各种不一致、违反直觉的陷阱。
  • @ahnbizcad 哦?除了$foo = ( bar() != $baz ),还有其他语言可以将$foo = bar() != $baz 格式读取为其他任何形式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多