PHP, как вернуть false с file () для пустого файла .csv?

Почему я всегда получаю массив с одним элементом пустой строки для пустого файла .csv?

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

print_r($content);

результат:

Array ( [0] => )

Могу ли я вернуться false чтобы я знал что в csv файле ничего нет?

0

Решение

Однострочный тест должен дать вам результат:

$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]) == '';

Не уверен, что еще тебе сказать. Я думаю, что мы предоставили вам немало инструментов и способов для проверки этой ситуации. Удачи.

2

Другие решения

Это похоже на специальное поведение на ваш вкус (никаких проблем с этим нет). Это означает, что вам, вероятно, следует создать для этого функцию-обертку.

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

РЕДАКТИРОВАТЬ: Включены отзывы @ Scrowler, и Майкл Дж. Маллиган.

4

попробуй это

$content = file('products.csv');
if(!empty($content)){
print_r();}{
else{
// Do something if no content
}
1
По вопросам рекламы [email protected]