#php #arrays #multidimensional-array
#php #массивы #многомерный массив
Вопрос:
Я пытаюсь преобразовать свой многомерный массив в строку, чтобы записать его в файл.
Сценарий: Соберите данные в массив, преобразуйте их в форматированную строку для лучшей читаемости и запишите в файл.
Проблема: когда я пытаюсь преобразовать многомерный массив, такой как показано ниже, с помощью netsted foreach, он работает не так, как задумано; в основном я получаю частичные данные с Array
выводами или просто с Array
выводами. Также, когда я пробую implode()
функцию, она извлекает только самые глубокие значения.
Пример вывода многомерного массива;
Array
(
[09_ERROR_TEXT_DESCR] => Array
(
[LINES] => Array
(
[0] => 1732
[1] => 1858
)
[COUNT] => 2
)
[12_ERROR_TEXT_DESCR] => Array
(
[LINES] => Array
(
[0] => 1936
)
[COUNT] => 1
)
[14_ERROR_TEXT_DESCR] => Array
(
[LINES] => Array
(
[0] => 1365
[1] => 1476
[2] => 1697
)
[COUNT] => 3
)
[15_ERROR_TEXT_DESCR] => Array
(
[LINES] => Array
(
[0] => 1697
)
[COUNT] => 1
)
)
Желаемый вывод строки для записи ее в файл;
09_ERROR_TEXT_DESCR|1732,1858|2
12_ERROR_TEXT_DESCR|1936|1
14_ERROR_TEXT_DESCR|1365,1476,1697|3
15_ERROR_TEXT_DESCR|1687|1
Примечание:
Я использую file_put_contents($debug_log_path, $result_set, LOCK_EX);
для записи файла, поскольку при каждом запуске я хочу, чтобы файл перезаписывался новыми данными. Вот почему я хочу преобразовать его в строку.
Комментарии:
1. каково происхождение массива и, что более важно, где находятся коды?
2. @Kevin Я заполняю этот массив после проверки входных данных из нескольких исходных кодов, извлеченных из моего частного GIT или баз данных с определенным форматом. Коды, которые я написал с упомянутыми выше возможностями, работали не так, как предполагалось, и большинство из них были бессмыслицей из-за моего отчаяния.
3. в принципе, вам просто нужно выполнить итерацию для каждого пакета, и внутри вам нужно сначала ввести
(,)
внутреннее измерение (lines
), затем объявить их внутри другого массива и снова ввести (|
) для последней строки вместе с ключом. точно так же, как ответ ниже4. Спасибо за объяснение @Kevin, как заявил Ник ниже, то, что вы упомянули, работает так, как ожидалось. Теперь я пытаюсь понять, как я мог ошибиться в такой простой задаче 🙂
5. @Nick, я, должно быть, пропустил ваш ответ, который, как мне казалось, я сделал. Ваш ответ является точным решением моего вопроса.
Ответ №1:
Вы можете добиться желаемого с помощью foreach
над массивом, извлекая ключ, LINES
и COUNT
значения и преобразуя их в строку. Я продемонстрировал добавление каждой строки в массив, вы можете либо записывать в файл по ходу, либо записывать весь массив в файл за один раз:
$result_set = [];
foreach ($array as $key => $value) {
$result_set[] = implode('|', array($key, implode(',', $value['LINES']), $value['COUNT']));
}
print_r($result_set);
Вывод:
Array
(
[0] => 09_ERROR_TEXT_DESCR|1732,1858|2
[1] => 12_ERROR_TEXT_DESCR|1936|1
[2] => 14_ERROR_TEXT_DESCR|1365,1476,1697|3
[3] => 15_ERROR_TEXT_DESCR|1697|1
)
Ответ №2:
Вероятно, вы можете сделать это намного проще, используя var_export()
или json_encode()
. Это приведет к созданию строки, подобной следующей, которую затем вы можете записать в файл:
array (
'09_ERROR_TEXT_DESCR' =>
array (
'LINES' =>
array (
0 => 1732,
1 => 1858,
),
'COUNT' => 2,
),
'12_ERROR_TEXT_DESCR' =>
array (
'LINES' =>
array (
0 => 1936,
),
'COUNT' => 1,
),
'14_ERROR_TEXT_DESCR' =>
array (
'LINES' =>
array (
0 => 1365,
1 => 1476,
2 => 1697,
),
'COUNT' => 3,
),
)
Смотрите пример.
Комментарии:
1. Спасибо, Xedin, я считаю, что решение @Nick является оптимальным
2. Зависит. Использование собственных функций PHP не означает написания, поддержки или отладки вашего собственного кода, включая код, который преобразует выходные данные обратно в структуру PHP.. Использование
var_export()
означает, что вы можете напрямую выполнить результат строки как PHP. Использованиеjson_encode()
означает преобразование ваших данных в очень распространенный формат обмена данными, легко анализируемый и читаемый человеком. Что оптимально в том, чтобы писать свои собственные реализации для вещей, которые уже существуют, и делать вещи лучше?