PHP: рекурсивно конвертировать массив в строку, если ключ имеет определенное значение - PullRequest
0 голосов
/ 15 октября 2019

У меня есть некоторые входные данные XML, которые я преобразую в массивы PHP, используя XML2Array от LaLit .

$array = XML2Array::createArray($xml);

Это дает мне многомерный массив, такой как этот, например:

Array (
    [title] =>      Array ( 
                        [@cdata] => My Playlist 
                    ) 
    [tracks] =>     Array (
                        [track] => Array (
                            [date] =>       2019-10-15T09:41:21+0000 
                            [position] =>   4
                            [title] =>      Array ( 
                                                [@cdata] => Hello 
                                            ) 
                            [creator] =>    Array ( 
                                                [@cdata] => The Beatles
                                            ) 
                        )
                        [track] => Array (
                            [date] =>       2019-10-15T09:41:21+0000 
                            [position] =>   5
                            [title] =>      Array ( 
                                                [@cdata] => How High? 
                                            ) 
                            [creator] =>    Array ( 
                                                [@cdata] => Olivier Boogie 
                                            ) 
                        )
                    )
)

Некоторые значения отформатированы следующим образом:

Array ( [@cdata] => value )

Я хотел бы запустить рекурсивную функцию для массива $, которая "сгладит" массивы @ cdata , чтобы получитьэтот результат вместо:

Array (
    [title] =>      My Playlist
    [tracks] =>     Array (
                        [track] => Array (
                            [date] =>       2019-10-15T09:41:21+0000 
                            [position] =>   4
                            [title] =>      Hello
                            [creator] =>    The Beatles
                        )
                        [track] => Array (
                            [date] =>       2019-10-15T09:41:21+0000 
                            [position] =>   5
                            [title] =>      How High?
                            [creator] =>    Olivier Boogie
                        )
                    )
)

Как я мог сделать? Спасибо!

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Вот базовая рекурсивная версия, если вам было интересно.

<?php

$cloned_data = $data;

function flattenCData($data,&$cloned_data){
    foreach($data as $key => $value){
        if(is_array($value)){
            if(isset($value['@cdata'])) $cloned_data[$key] = $value['@cdata'];
            else flattenCData($value,$cloned_data[$key]);
        }
    }
}

flattenCData($data,$cloned_data);
print_r($cloned_data);

Демо: https://3v4l.org/7s0sU

Просто клонируйте текущий массив, чтобы избежать одновременной модификации пос проблемой итерации при рекурсивном движении. Используйте &, чтобы убедиться, что вы редактируете тот же второй клонированный массив. Отдых интуитивно понятен.

0 голосов
/ 15 октября 2019

Для этого можно использовать array_walk .

function flatten_cdata($array) {
  array_walk($array, function (&$item, $key) {
    if (!is_array($item)) {
      return;
    }
    if (isset($item['@cdata'])) {
      $item = $item['@cdata'];
      return;
    }
    $item = flatten_cdata($item);
  });
  return $array;
}

var_dump(flatten_cdata([
    'track' => [
        'date' => '2019-10-15T09:41:21+0000',
        'position' => 5,
        'title' => [
            '@cdata' => 'How High?',
        ],
        'creator' => [
            '@cdata' => 'Olivier Boogie',
        ],
    ],
]));

Вывод:

Array
(
    [track] => Array
        (
            [date] => 2019-10-15T09:41:21+0000
            [position] => 5
            [title] => How High?
            [creator] => Olivier Boogie
        )

)
...