我有一个非常奇怪的问题,我一直无法找到答案。我有一个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
我猜这与我的完整数组以某种方式被评估为空并且即使它不是
答案 0 :(得分:0)
你这样说:
...并通过引用变量传递数组...
而且:
如果函数返回true,则检查以确保数组 没有传回null或空,然后对数据进行排序。
你为什么要这样做?如果您正在检查true
或false
,那么请检查它是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){
您的true
或false
逻辑可能已被破坏&amp;不值得正确处理。但是,如果值返回null
或empty
,那么为什么要花时间重新发明轮子,这就是你所采取的行动。
然后,您可以调整此$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);