【问题标题】:PHP recursive function to convert multidimensional array to xmlPHP递归函数将多维数组转换为xml
【发布时间】:2021-07-19 07:49:33
【问题描述】:

我需要将一个不定深度的数组转换为一个 xml 字符串。我认为递归函数会更好,因为数组的深度不是未知的,并且主要是 3 个级别。这是我到目前为止提出的递归函数

function array2xml($data, $key = ''){
    if(!is_array($data)){
        return "<".$key.">".$data."</".$key.">";
    }
    else{
        foreach($data as $key => $value){
            if(!is_array($value)){
                return array2xml($value, $key);
         }
        else{
            return "<".$key.">".array2xml($value)."</".$key.">";
        }
    }
}

这是初始调用,但它只返回数组中的第一个元素。例如,

echo array2xml([
    'students' => [
        'names' => [
            'frank' => '12',
            'jason' => '13',
            'beth' => '14'
        ],
        'groups' => [
            'yellow' => '165',
            'green' => '98'
        ]
    ]
]);

返回这个输出

<students><names><frank>12</frank></names></students>

如果有人能修复这个递归函数,让数组中的元素像这样打印出来,将不胜感激

<students> 
<names>
    <frankDiaz>12</frank>
    <jasonVaaz>13</jason>
    <bethDoe>14</beth>
</names>
<groups>
    <yellow>165</yellow>
</groups>

【问题讨论】:

    标签: php arrays xml recursion


    【解决方案1】:

    输出仍然作为 XML 工作,只是不那么容易被人类阅读。要在新行上添加内容,请尝试在每个元素后输入回车换行符。

    【讨论】:

    • 你的答案是什么?一个好的答案会发布如何解决问题并描述答案为何有效。
    【解决方案2】:

    问题是您在函数的foreach 循环中使用了return,因此过早地跳出循环/函数...

    当然,您也不考虑格式等因素;但这是小问题。

    更新说明

    • 该函数不再使用echo 来输出代码,而是以字符串形式返回,该字符串可以分配给变量或自行打印
    • 在问题中添加了 camelCase 名称作为更新

    代码

    $array = [
        'students' => [
            'names' => [
                'frankDiaz' => '12',
                'jasonVaaz' => '13',
                'bethDoe' => '14'
            ],
            'groups' => [
                'yellow' => '165',
                'green' => '98'
            ]
        ]
    ];
    
    function array2xml($array, $tabs = 0) {
        $xml = "";
        foreach ($array as $key => $arr) {
            if (is_array($arr)) {
                $xml .= str_repeat("    ", $tabs) . "<$key>\n";
                $xml .= array2xml($arr, $tabs + 1);
                $xml .= str_repeat("    ", $tabs) . "</$key>\n";
            } else {
                $xml .= str_repeat("    ", $tabs) . "<$key>$arr</$key>\n";
            }
        }
        return $xml;
    }
    
    echo array2xml($array);
    

    输出:

    <students>
        <names>
            <frankDiaz>12</frankDiaz>
            <jasonVaaz>13</jasonVaaz>
            <bethDoe>14</bethDoe>
        </names>
        <groups>
            <yellow>165</yellow>
            <green>98</green>
        </groups>
    </students>
    

    【讨论】:

    • 哇不错。这可行,但唯一的问题是我需要将 xml 分配给字符串而不是回显
    • 另外,我需要维护文本驼峰式。检查我更新的示例。在您的代码中,它将键更改为小写
    • @SaeeshTendulkar 我不确定您所说的将键更改为小写时的意思。这段代码非常 wysiwyg,即如果数组有 camelCase 键,那么输出将有 camelCase 键。我添加了更新问题中的示例。希望我理解正确?
    • @SaeeshTendulkar 我已将代码更新为 return 字符串,而不是 echo 它。现在您可以使用echo array2xml(...)$xmlString = array2xml(...)
    • @SaeeshTendulkar 你的意思是如果你用开发工具看它? (例如,在 chrome 中右键单击和 inspect element?)这只是因为您的浏览器将标签名称更改为小写,如果您使用 view source,那么您应该可以正确看到它?
    【解决方案3】:

    上面@Steven 的答案的变体,但使用 simplexml 创建实际的 xml:

    $xml_string = "";
    function array2xml($array) {
        global $xml_string;
        foreach ($array as $key => $arr) {        
            if (is_array($arr)) {            
                $xml_string .=  "<$key>\n";
                array2xml($arr);
            }
             else {
                $xml_string .=  "<$key>". $arr;
            }
             $xml_string .=  "</$key>\n";        
        }
    }
    array2xml($array);
    $final = simplexml_load_string($xml_string);
    echo $final->asXML();
    

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 2019-04-28
      • 2015-11-11
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多