Многомерный массив в форматированную строку

#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
)
  

Демонстрация на 3v4l.org

Ответ №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() означает преобразование ваших данных в очень распространенный формат обмена данными, легко анализируемый и читаемый человеком. Что оптимально в том, чтобы писать свои собственные реализации для вещей, которые уже существуют, и делать вещи лучше?