PHP:如果键具有一定的值,则递归地将数组转换为字符串



我有一些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
)
)

最新更新