在PHP中解析多维数组

时间:2016-07-26 15:56:50

标签: php arrays multidimensional-array

主要目标:稍后应将整个数组转换为XML。

我想做以下事情:  对于每个密钥(例如12772),必须从数据库中提取数据,因此我无法简单地转换它。获取的数据将是标记的属性。

我的想法是将最深的孩子组合成一个xml字符串。但是,如何判断自己是否处于最深层?我认为有点做... while-loop但我不知道如何确切地检查该元素是否有孩子。

数组深度可能因您所见而异:

Array
(
    [12772]=>Array
        (
            [16563]=>Array
                (
                    [0] => <xml>Information 1</xml>
                    [1] => <xml>Information 2</xml>
                )
        )

    [16532]=>Array
        (
            [0] => <xml>Information 1</xml>
            [1] => <xml>Information 2</xml>
        )

)

非常感谢任何帮助!

/编辑: 输出应该是:

<xml>
<testsuite id='12772' name='fetched from database'>
   <testsuite id='16563' name='fetched from database'>
      <testcase id='0'>Information 1</testcase>
      <testcase id='1'>Information 2</testcase>
   </testsuite>
</testsuite>
<testsuite id='16532' name='fetched from database'>
   <testcase id='0'>Information 1</testcase>
   <testcase id='1'>Information 2</testcase>
</testsuite>

1 个答案:

答案 0 :(得分:1)

递归是最好循环到树状结构。基本上,递归函数是一个调用自身的函数。例如:

$input = Array
(
    12772=>Array
        (
            16563=>Array
                (
                    0 => '<xml>Information 1</xml>',
                    1 => '<xml>Information 2</xml>'
                )
        ),
    16532=>Array
        (
            0 => '<xml>Information 1</xml>',
            1 => '<xml>Information 2</xml>'
        )

);

$xml = "";

recursiveFunction($xml, $input);

var_dump($xml);

function recursiveFunction(&$output, $node, $id = 0, $level = 0)
{

    if (is_array($node)) {

        if ($level === 0) {

             $output .= "<xml>" . PHP_EOL;

         } else {

            $output .= str_repeat("\t", $level) . "<testsuite id='" .  $id . " name='fetched from database'>" . PHP_EOL;
        } 

        foreach ($node as $id => $newNode) {
            recursiveFunction($output, $newNode, $id, $level + 1);
        }

        if ($level === 0) {

             $output .= "</xml>";

         } else {

            $output .= str_repeat("\t", $level) . "</testsuite>" . PHP_EOL;
        } 

    } else {

        $output .= str_repeat("\t", $level) . "<testcase id='" .  $id . "'>" . $node . "</testcase>" . PHP_EOL;
    }
}

您可以在此处进行测试:http://sandbox.onlinephpfunctions.com/code/dcabd9ffccc1a05621d8a21ef4b14f29b4a765ca