我有一些XML输入,我使用LaLit的XML2Array将其转换为PHP数组。
$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 )
我想在$array上运行一个递归函数,该函数将"扁平化">@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
)
)
)
我该怎么办? 谢谢!
如果您有兴趣,这里有一个基本的递归版本。
<?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
只需克隆当前数组,以避免递归移动时并发修改以及迭代问题。使用&
确保编辑相同的第二个克隆阵列。休息是直观的。
您可以使用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
)
)