完整数组计算为空和null

时间:2014-06-07 17:25:17

标签: php arrays csv usort

我有一个非常奇怪的问题,我一直无法找到答案。我有一个PHP函数,它将CSV数据读入一个数组,然后如果数据被成功读取则返回true并通过引用变量传回数组

function ReadCsvDataIntoArray($path, &$headers, &$array, $idFilter = NULL){     
    if(file_exists($path)){
        $fh = fopen($path, 'r');
        if($fh){
            $headers = fgetcsv($fh);
            $rowIdx = 0;
            while($row = fgetcsv($fh)){ 
                $addRow = true;
                if($idFilter != NULL){      
                    if(isset($row[0])){
                        if(!in_array($row[0], $idFilter)){
                            $addRow = false;
                        }
                    }
                }
                if($addRow){
                    $colIdx = 0;
                    foreach($row as $val){      
                        $array[$rowIdx][$headers[$colIdx]] = $val;
                        $colIdx++;  
                    }
                    $rowIdx++;                      
                }
            }           
            fclose($fh);
            return true;
        } else {
            echo "Unable to open file: ".$path;
        }
    } else {
        echo "CSV doesn't exist: ".$path;
    }
    return false;
}

如果函数返回true,则检查以确保数组没有作为null或空传回,然后对数据进行排序。

if($this->ReadCsvDataIntoArray($client_library_path, $headers, $CSVdata, $log)){
     if($CSVData != NULL){

          usort($CSVdata, create_function('$a, $b', 'return $a["engagement"] < $b["engagement"];'));

      // Do stuff with the sorted array

     } else {
          echo "CSV data is NULL.\n";
     }

我一直在&#34; CSV数据为空&#34;由此。如果我将逻辑更改为if($CSVData == NULL)或甚至if(empty($CSVData))它会输入if语句,尝试对数组进行排序(即使if语句显示为&# 39; s为空)并对数据进行处理。

这是我的第二个问题。这个usort适用于我的localhost:

usort($CSVdata, function($a, $b) { return $a["scheduled"] < $b["scheduled"]; });

但由于它的php版本,它在服务器上不起作用,所以我把它改成了:

usort($CSVData, create_function('$a, $b', 'return $a["scheduled"] < $b["scheduled"];'));

但是使用create_function版本的usort我收到此错误消息

Warning: usort(): The argument should be an array 

我猜这与我的完整数组以某种方式被评估为空并且即使它不是的事实有关。

1 个答案:

答案 0 :(得分:0)

你这样说:

  

...并通过引用变量传递数组...

而且:

  

如果函数返回true,则检查以确保数组   没有传回null或空,然后对数据进行排序。

你为什么要这样做?如果您正在检查truefalse,那么请检查它是null还是empty是什么价值?只需通过执行以下操作检查是null还是empty

        // return true;
        return $array;
    } else {
        echo "Unable to open file: ".$path;
    }
} else {
    echo "CSV doesn't exist: ".$path;
}
// return false;
return $array;

然后在界面中删除$array的引用返回:

function ReadCsvDataIntoArray($path, &$headers, $array, $idFilter = NULL){ 

您的truefalse逻辑可能已被破坏&amp;不值得正确处理。但是,如果值返回nullempty,那么为什么要花时间重新发明轮子,这就是你所采取的行动。

然后,您可以调整此$CSVData逻辑以适应新结构:

 $CSVData = $this->ReadCsvDataIntoArray($client_library_path, $headers, $CSVdata, $log);

 if(!empty($CSVData)){

      usort($CSVdata, create_function('$a, $b', 'return $a["engagement"] < $b["engagement"];'));

  // Do stuff with the sorted array

 } else {
      echo "CSV data is empty.\n";
 }

此外,您的整个return true逻辑严格基于文件本身可以打开:

    $fh = fopen($path, 'r');
    if($fh){
        // Code removed for structural illustration purposes.
        // ...
        // ...
        fclose($fh);
        return true;
    } else {

但你说这个; empahsis mine:

  

我有一个PHP函数,它将CSV数据读入数组,然后返回   如果数据已成功读取,则为true ...

没有。您的逻辑不会检查数据是否已成功读取。如果可以读取文件本身,则您的逻辑只返回true。这并不意味着文件本身的内容是有效的。你检查过文件了吗?或者您是否检查了这一行:

while($row = fgetcsv($fh)){

通过做这样的事情实际上在$row中有值?

echo '<pre>';
print_r($row);
echo '</pre>';

我认为您的CSV可能存在行格式问题。就像它保存在Windows机器上一样,但现在可以在Mac OS X或Linux机器上读取,或者相反。请在fgetcsv的文档中查看:

  

注意:如果PHP在阅读时没有正确识别行结尾   Macintosh计算机上或由Macintosh计算机创建的文件,启用   auto_detect_line_endings运行时配置选项可能会有所帮助   解决问题。

因此,或许可以将auto_detect_line_endings这一行添加到您的函数中,如下所示:

function ReadCsvDataIntoArray($path, &$headers, &$array, $idFilter = NULL){
    ini_set("auto_detect_line_endings", true);