Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP如何使用file()为空的.csv文件返回false?_Php_File_Csv_Fgetcsv - Fatal编程技术网

PHP如何使用file()为空的.csv文件返回false?

PHP如何使用file()为空的.csv文件返回false?,php,file,csv,fgetcsv,Php,File,Csv,Fgetcsv,为什么对于空的.csv文件,我总是得到一个带有一个空字符串项的数组 $content = file('products.csv'); print_r($content); 结果: Array ( [0] => ) 我是否可以返回false,以便知道csv文件中没有任何内容?这似乎是您特别喜欢的特殊行为,这一点都没有问题。也就是说,您可能应该为此创建一个包装器函数 function contentIsNotEmpty($content) { $isEmpty = empty($c

为什么对于空的.csv文件,我总是得到一个带有一个空字符串项的数组

$content = file('products.csv');

print_r($content);
结果:

Array ( [0] => )

我是否可以返回false,以便知道csv文件中没有任何内容?

这似乎是您特别喜欢的特殊行为,这一点都没有问题。也就是说,您可能应该为此创建一个包装器函数

function contentIsNotEmpty($content) {
   $isEmpty = empty($content) || (count($content) == 1 && empty($content[0]));
   return $isEmpty ? false : $content;
}

编辑:合并了@scrowler的反馈和Michael J.Mulligan的反馈。

单线测试应该会得到结果:

$empty=empty$content | | count$content===1&&empty$content[0]

以下应避免假空:

$empty=empty$content | | count$content==1&&$content[0]==

如果您需要一个可重用的函数,并且如您所述,希望获得一个数组或什么都没有,这可能会有帮助:

function get_file($file_name = null, $strict = false) {
    $return = null;
    if(!empty($file_name) && is_readable($file_name)) {
        $contents = file($file_name);
        if(
            !empty($contents)
            && (
                count($contents) > 1 
                || (
                    !empty($contents[0])
                    || ($strict && $contents[0] !== '')
                )
            )
        ) {
            $return = $contents;
        }
    }
    return $return;
}
我的意思是,我们可以得到各种各样的创意和迭代,等等,但我想你明白了

如果您想获取CSV文件,我建议使用类似fgetcsv的方法重新调整用途:

function getcsv($file_name, $headers = array(), $delimiter = ',', $enclosure = '"', $escape = "\\" ) {
    $contents = array();
    $get_headers = $headers === FALSE;
    $headers = is_array($headers) ? array_values($headers) : array();
    if(!empty($file_name) && is_readable($file_name)) {
        $row = 0;
        if (($handle = fopen($file_name, "r")) !== FALSE) {
            while (($data = fgetcsv($handle, 0, $delimiter, $enclosure, $escape)) !== FALSE) {
                if($get_headers && empty($headers)) {
                    $headers = $data;
                    continue;
                }
                foreach($data as $i => $col_value) {
                    $col_name = isset($headers[$i]) ? $headers[$i] : $i;
                    $contents[$row][$col_name] = $col_value;
                }
                $row++;
            }
            fclose($handle);
        }
    }

    return $contents;
}
注意,上面没有测试,只是一个快速的草稿,我要睡觉了。如果需要的话,我明天会编辑它

最后,如果您得到的是一条带有空白的直线,并且这在您的眼睛中验证为空,请在修剪后对其进行简单测试:

$empty_line = trim($content[$line_num]) == '';
不知道还能告诉你什么。我认为我们已经为您配备了很多工具和方法来验证这种情况。祝你好运。

试试这个

$content = file('products.csv');
         if(!empty($content)){
          print_r();}{
        else{
           // Do something if no content
        }

Try-如果文件大小'products.csv'==0,则函数不知道csv。但是,也有跳过空行的选项。通过添加一些包装材料…你也应该看到-但即使如此,空行也不是绝对的,你可能会遇到一个伪空文本文件,它实际上有一个换行符或UTF-8 BOM。-更不用说那些问答中没有提到的unicode字符了。你应该使用fgetcsv来读取CSV文件,而不是文件。或者如果它为空,最好返回false,否则返回内容,例如$contents=file$filename;返回空$contents?虚假内容;同意。这更符合OP的要求。@scrowler如果变量是一个只有一个空条目的数组,那么它将无效。数组不再为空,因为它有一个条目@MichaelJMulligan足够公平-返回空$contents | |空$contents[关键字$contents]?虚假内容@如果只有第一个条目是空的,但是有100个条目呢?谢谢。但我担心它对我不起作用,因为对于var_dump$contentst[0];我总是得到字符串“”长度=2…添加了对空白字符串的检查。唯一的注释是您只能假设第一个数组键为零$contents[key$contents]将更安全地返回数组中的第一个条目这不是一个假设,文件将只返回索引从0开始的数组,或者返回false。