PHP 如何 return false with file() for an empty .csv file?
PHP how to return false with file() for an empty .csv file?
为什么对于一个空的 .csv 文件,我总是得到一个包含一项空字符串的数组?
$content = file('products.csv');
print_r($content);
结果:
Array ( [0] => )
我可以 return 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]));
以下应避免"fake empty":
$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;
}
注意,以上未经测试,只是草稿,我要睡觉了。如果需要我明天再编辑。
最后,如果你得到一条带有白色-space 的单行,并且这在你眼中验证为 "empty",请在 trim 之后简单地测试它:
$empty_line = trim($content[$line_num]) == '';
不知道还能告诉你什么。我想我们已经为您提供了很多工具和方法来验证这种情况。祝你好运。
试试这个
$content = file('products.csv');
if(!empty($content)){
print_r();}{
else{
// Do something if no content
}
为什么对于一个空的 .csv 文件,我总是得到一个包含一项空字符串的数组?
$content = file('products.csv');
print_r($content);
结果:
Array ( [0] => )
我可以 return 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]));
以下应避免"fake empty":
$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;
}
注意,以上未经测试,只是草稿,我要睡觉了。如果需要我明天再编辑。
最后,如果你得到一条带有白色-space 的单行,并且这在你眼中验证为 "empty",请在 trim 之后简单地测试它:
$empty_line = trim($content[$line_num]) == '';
不知道还能告诉你什么。我想我们已经为您提供了很多工具和方法来验证这种情况。祝你好运。
试试这个
$content = file('products.csv');
if(!empty($content)){
print_r();}{
else{
// Do something if no content
}