Запись массива в файл: примеры и пояснения
Основные способы записи массива в файл в PHP
Каким образом можно сохранить массив в файл в универсальном формате для обмена данными?
Наиболее эффективным решением является использование JSON. Функция file_put_contents в сочетании с json_encode позволяет записать массив в файл в виде строки JSON. Этот формат легко читается, поддерживается многими языками и позволяет восстановить исходные данные с помощью json_decode.
<?php
$array = ['name' => 'Иван', 'age' => 30, 'city' => 'Москва'];
$json = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
file_put_contents('data.json', $json);
?>Php записать массив (запись массива в файл в php)
В этом примере массив преобразуется в JSON с сохранением кириллицы (флаг JSON_UNESCAPED_UNICODE) и форматированием (флаг JSON_PRETTY_PRINT). Файл data.json будет содержать структурированные данные.
Возможные проблемы:
- Ошибка кодирования при наличии нестроковых ключей или ресурсов. Решение: проверять типы значений.
- Отсутствие прав на запись в директорию. Решение: проверить права и установить их (chmod).
- Потеря данных при записи большого массива из-за ограничения памяти. Решение: увеличить memory_limit или записывать частями.
Цель: сохранение данных для передачи между системами или хранения конфигураций.
Как записать массив в файл в формате serialize?
Сериализация через serialize сохраняет структуру PHP-массива вместе с типами данных. Для записи используется file_put_contents.
<?php
$array = ['a' => 1, 'b' => [2, 3]];
$data = serialize($array);
file_put_contents('data.ser', $data);
?>Downloads php action (скачивание файлов через php)
Восстановление происходит через unserialize. Этот метод подходит для хранения сложных структур, но небезопасен при использовании данных из ненадёжного источника.
Ошибка: при изменении класса объекта после сериализации может возникнуть ошибка при десериализации. Решение: обновлять версию сериализованных данных.
Цель: внутреннее хранение данных с сохранением типов.
Как записать массив в файл с помощью fwrite и цикла?
Для создания простого текстового файла с разделителями можно пройтись по массиву циклом и записать строки через fwrite.
<?php
$array = ['apple', 'banana', 'cherry'];
$file = fopen('fruits.txt', 'w');
foreach ($array as $fruit) {
fwrite($file, $fruit . "\n");
}
fclose($file);
?>
Каждый элемент массива записывается на новой строке. Подходит для списков значений.
Неудобно для ассоциативных массивов или вложенных структур; отсутствует стандартный способ восстановления.
Цель: простой текстовый вывод, логи.
Как записать многомерный массив в CSV файл?
Для табличных данных удобен формат CSV. Функция fputcsv форматирует строки с разделителями.
<?php
$data = [
['Name', 'Age', 'City'],
['Иван', 30, 'Москва'],
['Мария', 25, 'Санкт-Петербург']
];
$file = fopen('users.csv', 'w');
foreach ($data as $row) {
fputcsv($file, $row);
}
fclose($file);
?>
Получается CSV с заголовком. Для чтения используется fgetcsv.
Проблемы с кодировкой: если данные содержат разделитель (запятую), нужно экранировать или использовать другой разделитель. Решение: указать второй параметр delimiter.
Цель: экспорт табличных данных.
Как сохранить массив в формате, пригодном для include?
Функция var_export возвращает строку, содержащую PHP-код, который можно использовать для создания переменной. Запись в файл с добавлением <?php return позволяет подключать файл через include и получать массив.
<?php
$array = ['key' => 'value'];
$export = var_export($array, true);
file_put_contents('config.php', '<?php return ' . $export . ';');
?>
Восстановление: $config = include 'config.php';. Эффективно для конфигураций, так как не требует десериализации.
Не подходит для объектов или ресурсов; файл становится уязвимым для инъекций, если данные не экранированы.
Цель: конфигурационные файлы, кеш.
Расширенные примеры записи массива в файл
Пример 1: Атомарная запись с использованием временного файла
Для предотвращения повреждения данных при сбое используется запись во временный файл с последующим переименованием.
<?php
$array = ['status' => 'ok', 'timestamp' => time()];
$tmp = tempnam(sys_get_temp_dir(), 'array_');
$json = json_encode($array, JSON_UNESCAPED_UNICODE);
file_put_contents($tmp, $json);
rename($tmp, 'status.json');
?>
Результат: файл status.json будет либо полностью записан, либо не создан.
Файл status.json: {"status":"ok","timestamp":1700000000}
Проблема: если rename не удаётся (другая файловая система), данные теряются. Решение: использовать copy + unlink.
Пример 2: Запись в CSV с пользовательским разделителем и обработкой null
Для данных с разделителем-точкой с запятой и пустыми значениями.
<?php
$data = [
['ID', 'Name', 'Note'],
[1, 'Продукт A', null],
[2, 'Продукт B', 'Описание с ; внутри']
];
$file = fopen('products.csv', 'w');
foreach ($data as $row) {
$row = array_map(function($val) { return $val === null ? 'NULL' : $val; }, $row);
fputcsv($file, $row, ';', '"');
}
fclose($file);
?>
Результат (products.csv):
ID;Name;Note 1;Продукт A;NULL 2;Продукт B;"Описание с ; внутри"
Ошибка: если не экранировать null, fputcsv может добавить пустые поля, что нарушит структуру. Решение: замена null на строку.
Пример 3: Использование SplFileObject для построчной записи
Объектно-ориентированный подход к работе с файлами.
<?php
$array = ['line1', 'line2', 'line3'];
$file = new SplFileObject('lines.txt', 'w');
foreach ($array as $line) {
$file->fwrite($line . "\n");
}
$file = null; // закрытие файла
?>
Результат: файл lines.txt с тремя строками.
Проблема: при большом количестве строк может быть медленнее, чем fwrite в цикле. Решение: использовать буферизацию.
Пример 4: Потоковая запись с фильтром base64
Для сохранения бинарных данных массива в текстовый файл через base64.
<?php
$array = ['img' => base64_encode(file_get_contents('photo.jpg'))];
$stream = fopen('data.txt', 'w');
stream_filter_append($stream, 'convert.base64-encode');
fwrite($stream, serialize($array));
fclose($stream);
?>
Результат: файл data.txt содержит сериализованные данные в base64. При чтении применяется фильтр decode.
Ошибка: фильтры могут не поддерживаться на некоторых системах. Решение: проверять наличие stream_filter_register.
Пример 5: Генератор для записи большого массива частями
При нехватке памяти массив разбивается на части и записывается по частям.
<?php
function arrayChunkGenerator($array, $chunkSize) {
$len = count($array);
for ($i = 0; $i < $len; $i += $chunkSize) {
yield array_slice($array, $i, $chunkSize);
}
}
$bigArray = range(1, 100000);
$file = fopen('big.json', 'w');
fwrite($file, '[');
$first = true;
foreach (arrayChunkGenerator($bigArray, 1000) as $chunk) {
if (!$first) fwrite($file, ',');
fwrite($file, json_encode($chunk, JSON_UNESCAPED_UNICODE));
$first = false;
}
fwrite($file, ']');
fclose($file);
?>
Результат: файл big.json содержит полный массив, сформированный из кусков, без загрузки всего в память.
Проблема: при ручной сборке JSON легко нарушить формат (лишние запятые). Решение: использовать json_encode для всего массива, если позволяет память.