Запись массива в файл: примеры и пояснения

Раздел: Работа с файлами -> Файловый ввод/вывод

Основные способы записи массива в файл в 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 для всего массива, если позволяет память.

Запись массива в файл в PHP - comments

En
Php записать массив (php)