Как избежать предупреждения «Может вызвать устаревшее преобразование «false» в массив» при изменении значения массива, в ⇐ Php
-
Anonymous
Как избежать предупреждения «Может вызвать устаревшее преобразование «false» в массив» при изменении значения массива, в
Я читаю файлы CSV с четырьмя столбцами, четвертый столбец — это строка, представляющая денежные значения в формате, подобном этому: $1000,23, -$21 000,24 и т. д.
Я хочу сохранить каждую строку в ассоциативном массиве с соответствующим заголовком, например (допустим, у меня есть CSV-файл с двумя строками):
Массив ( [0] => Массив ( [дата] => 04.01.2021 [контрольный_номер] => 7777 [описание] => Транзакция 1 [сумма] => $150,43 ) [1] => Массив ( [дата] => 05.01.2021 [контрольный_номер] => [описание] => Транзакция 2 [сумма] => $700,25 ) ) Дело в том, что я хочу сохранить строковое значение amount в виде числового значения (с плавающей запятой).
Так мне удалось сделать это с помощью этой функции
функция getTransactions(string $file_name): массив { если (!file_exists($file_name)) { триггер_ошибка('Файл "' . $file_name . '" не существует.', E_USER_ERROR); } $file = fopen($file_name, 'r'); $данные = []; fgetcsv($файл, 500); $headers = ['дата', 'check_number', 'описание', 'сумма']; while (($transaction = fgetcsv($file, 500)) !== false) { $transaction[3] = str_replace(["$", ','], "", $transaction[3]); $data[] = array_combine($headers, $transaction); } fclose($файл); вернуть $данные; } Это работает, но меня предупреждает о «ложном» преобразовании. Я думаю, это для функции fgetcsv(), поскольку она может вернуть значение «false», даже если цикл while этого не позволяет.
Итак... Как мне избежать этого предупреждения? Есть ли другой способ реализовать это?
Я пытался сначала сохранить каждую строку, затем изменить строку amount с помощью array_map(), но тогда я не могу изменить ключи значений строк функция getTransactions(string $file_name): массив { если (!file_exists($file_name)) { триггер_ошибка('Файл "' . $file_name . '" не существует.', E_USER_ERROR); } $file = fopen($file_name, 'r'); $данные = []; fgetcsv($файл, 500); $headers = ['дата', 'check_number', 'описание', 'сумма']; while (($transaction = fgetcsv($file, 500)) !== false) { $данные[] = $транзакция; } $data = array_map(fn($element) => [ $элемент[0], $элемент[1], $элемент[2], str_replace(["$", ','], "", $element[3]) ], $данные); // Я не могу понять, как изменить ключ с 0, 1, 2, 3 на «дата», «номер_проверки», «описание», «сумма» fclose($файл); вернуть $данные; } Массив ( [0] => Массив ( [0] => 04.01.2021 [1] => 7777 [2] => Транзакция 1 [3] => 150,43 ) [1] => Массив ( [0] => 05.01.2021 [1] => [2] => Транзакция 2 [3] => 700,25 ) ) Изменить CSV-файлы:
sample_01.csv
Дата, проверка, описание, сумма 04.01.2021,7777,Транзакция 1,"$150,43" 05.01.2021,,Транзакция 2,"$700,25" 06.01.2021,,Транзакция 3,"-$1303,97" 07.01.2021,,Транзакция 4,"$46,78" 08.01.2021,,Транзакция 5,"$816,87" sample_02.csv
Дата, проверка, описание, сумма 26.01.2021,,Транзакция А,"$550,10" 27.01.2021,,Транзакция Б,"-$825,77" 28.01.2021,4250,Транзакция C,"$212,68" 29.01.2021,,Транзакция D,"$195,68" 02.02.2021,9915,Транзакция E,"-$463,75" Я получаю предупреждение об устаревании
Минимальный пример
Как я уже сказал, все работает нормально, но в будущем может не работать. [Я думаю, что в PHP 9 это приведет к фатальной ошибке][3], поэтому мне нужен обходной путь, позволяющий избежать такого сценария в будущем.
Структура папок для этого примера
php-appp/ ├─ хранилище/ │ ├─ sample_01.csv │ ├─ sample_02.csv index.php Код
$root = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR; define('FILES_PATH', $root. 'хранилище'. DIRECTORY_SEPARATOR); функция getTransactionFiles (строка $dir_path): массив { $without_dots = array_diff(scandir($dir_path), ['.', '..']); return array_map(fn($item) => $dir_path. $item, $without_dots); } функция getTransactions(строка $file_name): массив { если (!file_exists($file_name)) { триггер_ошибка('Файл "' . $file_name . '" не существует.', E_USER_ERROR); } $file = fopen($file_name, 'r'); $данные = []; fgetcsv($файл, 500); $headers = ['дата', 'check_number', 'описание', 'сумма']; while (($transaction = fgetcsv($file, 500)) !== false) { $transaction[3] = str_replace(["$", ','], "", $transaction[3]); $data[] = array_combine($headers, $transaction); } fclose($файл); вернуть $данные; } $files = getTransactionFiles(FILES_PATH); $транзакции = []; foreach ($files как $file) { $transactions = array_merge($transactions, getTransactions($file)); } эхо ''; print_r ($ транзакции); эхо ''; Он напечатает это
Массив ( [0] => Массив ( [дата] => 04.01.2021 [контрольный_номер] => 7777 [описание] => Транзакция 1 [сумма] => 150,43 ) [1] => Массив ( [дата] => 05.01.2021 [контрольный_номер] => [описание] => Транзакция 2 [сумма] => 700,25 ) [2] => Массив ( [дата] => 06.01.2021 [контрольный_номер] => [описание] => Транзакция 3 [сумма] => -1303,97 ) [3] => Массив ( [дата] => 07.01.2021 [контрольный_номер] => [описание] => Транзакция 4 [сумма] => 46,78 ) [4] => Массив ( [дата] => 08.01.2021 [контрольный_номер] => [описание] => Транзакция 5 [сумма] => 816,87 ) [5] => Массив ( [дата] => 26.01.2021 [контрольный_номер] => [описание] => Транзакция A [сумма] => 550,10 ) [6] => Массив ( [дата] => 27.01.2021 [контрольный_номер] => [описание] => Транзакция B [сумма] => -825,77 ) [7] => Массив ( [дата] => 28.01.2021 [check_number] => 4250 [описание] => Транзакция C [сумма] => 212,68 ) [8] => Массив ( [дата] => 29.01.2021 [контрольный_номер] => [описание] => Транзакция D [сумма] => 195,68 ) [9] => Массив ( [дата] => 02.02.2021 [контрольный_номер] => 9915 [описание] => Транзакция E [сумма] => -463,75 ) )
Я читаю файлы CSV с четырьмя столбцами, четвертый столбец — это строка, представляющая денежные значения в формате, подобном этому: $1000,23, -$21 000,24 и т. д.
Я хочу сохранить каждую строку в ассоциативном массиве с соответствующим заголовком, например (допустим, у меня есть CSV-файл с двумя строками):
Массив ( [0] => Массив ( [дата] => 04.01.2021 [контрольный_номер] => 7777 [описание] => Транзакция 1 [сумма] => $150,43 ) [1] => Массив ( [дата] => 05.01.2021 [контрольный_номер] => [описание] => Транзакция 2 [сумма] => $700,25 ) ) Дело в том, что я хочу сохранить строковое значение amount в виде числового значения (с плавающей запятой).
Так мне удалось сделать это с помощью этой функции
функция getTransactions(string $file_name): массив { если (!file_exists($file_name)) { триггер_ошибка('Файл "' . $file_name . '" не существует.', E_USER_ERROR); } $file = fopen($file_name, 'r'); $данные = []; fgetcsv($файл, 500); $headers = ['дата', 'check_number', 'описание', 'сумма']; while (($transaction = fgetcsv($file, 500)) !== false) { $transaction[3] = str_replace(["$", ','], "", $transaction[3]); $data[] = array_combine($headers, $transaction); } fclose($файл); вернуть $данные; } Это работает, но меня предупреждает о «ложном» преобразовании. Я думаю, это для функции fgetcsv(), поскольку она может вернуть значение «false», даже если цикл while этого не позволяет.
Итак... Как мне избежать этого предупреждения? Есть ли другой способ реализовать это?
Я пытался сначала сохранить каждую строку, затем изменить строку amount с помощью array_map(), но тогда я не могу изменить ключи значений строк функция getTransactions(string $file_name): массив { если (!file_exists($file_name)) { триггер_ошибка('Файл "' . $file_name . '" не существует.', E_USER_ERROR); } $file = fopen($file_name, 'r'); $данные = []; fgetcsv($файл, 500); $headers = ['дата', 'check_number', 'описание', 'сумма']; while (($transaction = fgetcsv($file, 500)) !== false) { $данные[] = $транзакция; } $data = array_map(fn($element) => [ $элемент[0], $элемент[1], $элемент[2], str_replace(["$", ','], "", $element[3]) ], $данные); // Я не могу понять, как изменить ключ с 0, 1, 2, 3 на «дата», «номер_проверки», «описание», «сумма» fclose($файл); вернуть $данные; } Массив ( [0] => Массив ( [0] => 04.01.2021 [1] => 7777 [2] => Транзакция 1 [3] => 150,43 ) [1] => Массив ( [0] => 05.01.2021 [1] => [2] => Транзакция 2 [3] => 700,25 ) ) Изменить CSV-файлы:
sample_01.csv
Дата, проверка, описание, сумма 04.01.2021,7777,Транзакция 1,"$150,43" 05.01.2021,,Транзакция 2,"$700,25" 06.01.2021,,Транзакция 3,"-$1303,97" 07.01.2021,,Транзакция 4,"$46,78" 08.01.2021,,Транзакция 5,"$816,87" sample_02.csv
Дата, проверка, описание, сумма 26.01.2021,,Транзакция А,"$550,10" 27.01.2021,,Транзакция Б,"-$825,77" 28.01.2021,4250,Транзакция C,"$212,68" 29.01.2021,,Транзакция D,"$195,68" 02.02.2021,9915,Транзакция E,"-$463,75" Я получаю предупреждение об устаревании
Минимальный пример
Как я уже сказал, все работает нормально, но в будущем может не работать. [Я думаю, что в PHP 9 это приведет к фатальной ошибке][3], поэтому мне нужен обходной путь, позволяющий избежать такого сценария в будущем.
Структура папок для этого примера
php-appp/ ├─ хранилище/ │ ├─ sample_01.csv │ ├─ sample_02.csv index.php Код
$root = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR; define('FILES_PATH', $root. 'хранилище'. DIRECTORY_SEPARATOR); функция getTransactionFiles (строка $dir_path): массив { $without_dots = array_diff(scandir($dir_path), ['.', '..']); return array_map(fn($item) => $dir_path. $item, $without_dots); } функция getTransactions(строка $file_name): массив { если (!file_exists($file_name)) { триггер_ошибка('Файл "' . $file_name . '" не существует.', E_USER_ERROR); } $file = fopen($file_name, 'r'); $данные = []; fgetcsv($файл, 500); $headers = ['дата', 'check_number', 'описание', 'сумма']; while (($transaction = fgetcsv($file, 500)) !== false) { $transaction[3] = str_replace(["$", ','], "", $transaction[3]); $data[] = array_combine($headers, $transaction); } fclose($файл); вернуть $данные; } $files = getTransactionFiles(FILES_PATH); $транзакции = []; foreach ($files как $file) { $transactions = array_merge($transactions, getTransactions($file)); } эхо ''; print_r ($ транзакции); эхо ''; Он напечатает это
Массив ( [0] => Массив ( [дата] => 04.01.2021 [контрольный_номер] => 7777 [описание] => Транзакция 1 [сумма] => 150,43 ) [1] => Массив ( [дата] => 05.01.2021 [контрольный_номер] => [описание] => Транзакция 2 [сумма] => 700,25 ) [2] => Массив ( [дата] => 06.01.2021 [контрольный_номер] => [описание] => Транзакция 3 [сумма] => -1303,97 ) [3] => Массив ( [дата] => 07.01.2021 [контрольный_номер] => [описание] => Транзакция 4 [сумма] => 46,78 ) [4] => Массив ( [дата] => 08.01.2021 [контрольный_номер] => [описание] => Транзакция 5 [сумма] => 816,87 ) [5] => Массив ( [дата] => 26.01.2021 [контрольный_номер] => [описание] => Транзакция A [сумма] => 550,10 ) [6] => Массив ( [дата] => 27.01.2021 [контрольный_номер] => [описание] => Транзакция B [сумма] => -825,77 ) [7] => Массив ( [дата] => 28.01.2021 [check_number] => 4250 [описание] => Транзакция C [сумма] => 212,68 ) [8] => Массив ( [дата] => 29.01.2021 [контрольный_номер] => [описание] => Транзакция D [сумма] => 195,68 ) [9] => Массив ( [дата] => 02.02.2021 [контрольный_номер] => 9915 [описание] => Транзакция E [сумма] => -463,75 ) )
Мобильная версия