我有一个非常奇怪的问题,我一直无法找到答案。我有一个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,则我检查,以确保该数组没有被传回为空或空,然后对数据进行排序。
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";
}
我不断收到“CSV数据为NULL”。如果我将逻辑更改为if($CSVData == NULL)
甚至if(empty($CSVData))
,它将输入if
语句,尝试对数组进行排序(尽管if
声明为空),并尝试对数据进行排序。
这是我的第二个问题来自于这usort工作在我的本地:
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
我猜这与我的完整数组在某种程度上被评估为空和空的事实有关,即使它不是。
我想这可能是这个问题为好,但得到的数组作为返回变量时,我仍然得到同样的结果如你所建议的。 –
@ReedRaymond够公平的。引用只是让我迷惑,在这种情况下真的是多余的,所以我仍然坚持你返回一个数组并检查它是否为空。这就是说,检查我最近的编辑。你的'true'逻辑不是基于CSV数据是否实际解析,而仅仅取决于文件本身是否可读。能够读取文件并能够解析内容是两件不同的事情。所以我相信你的CSV可能有行格式问题。在我所说的地方查看我当前的编辑,“但是你这样说:” – JakeGould
此信息非常有帮助。我同意将数组作为返回变量传递更合理。我也检查过,在返回之前,数组在'ReadCsvDataIntoArray()'内部被赋值'!empty',并在返回之后被赋值为'empty'。我知道数据是有效的和适当的结构,因为当我使用“空”数组时,一切正常。你的建议改善了我的逻辑,但我仍然坚持一个“空的”完整数组...... –