首页 > 解决方案 > XML 递归迭代分组

问题描述

需要解析一个家庭中具有不同深度的“孩子”的 XML 文件,以将所有后代放入一个列表中。

https://3v4l.org/GV0UV的示例代码所示,其中包含 XML,处理 XML 的代码是这样的,其中$buffer包含 XML:

$xml       = new SimpleXMLIterator($buffer);
$recursive = new RecursiveIteratorIterator($xml);

foreach ($recursive as $tag => $object) {
    if ($tag !== 'Name') { 
        continue;
    }

        echo "-> " . $object ;
}

输出是这样的

-> 1David-> 1Samuel-> 1Fred-> 1John-> 1Frank-> 1Robert-> 2David-> 2Samuel-> 2Fred-> 2John-> 3David-> 3Samuel-> 3Fred-> 3John-> 3Frank

我需要将其分成多个家庭(“1David”是一个与“2David”不同的家庭的人;在现实世界中,为每个家庭成员假设不同的名字)。

所需的输出应该是这样的:

-> 1David-> 1Samuel-> 1Fred-> 1John-> 1Frank-> 1Robert
-> 2David-> 2Samuel-> 2Fred-> 2John
-> 3David-> 3Samuel-> 3Fred-> 3John-> 3Frank

因此,RecursiveIteratorIterator在 XML 中查找所有“名称”值,但输出需要分成“系列”。

如何将名称的提取分成系列?

(注意:我之前的问题是在这里迭代一个多级 XML 文件;有人建议我开始一个新问题。)

标签: phpxml

解决方案


您可以简单地检查RecursiveIteratorIterator(using getDepth()) 的级别,它会告诉您嵌套有多远。1 表示您处于最高级别...

foreach ($recursive as $tag => $object) {
    if ($tag !== 'Name') {
        continue;
    }

    if ( $recursive->getDepth() == 1 )  {
        echo PHP_EOL;
    }
    echo "-> " . $object ;
}

这将回声...

-> 1David-> 1Samuel-> 1Fred-> 1John-> 1Frank-> 1Robert
-> 2David-> 2Samuel-> 2Fred-> 2John
-> 3David-> 3Samuel-> 3Fred-> 3John-> 3Frank

尽管它的前面确实有一个空行,但这应该很容易删除。

把它变成存储数据的东西......

$output = [];
$family = [];
foreach ($recursive as $tag => $object) {
    if ($tag !== 'Name') {
        continue;
    }

    if ( $recursive->getDepth() == 1 )  {
        if (!empty($family) )   {
            $output[] = $family;
            $family = [];
        }
    }
    $family[] = (string)$object;
}
if (!empty($family) )   {
    $output[] = $family;
}

print_r($output);

给...

Array
(
    [0] => Array
        (
            [0] => 1David
            [1] => 1Samuel
            [2] => 1Fred
            [3] => 1John
            [4] => 1Frank
            [5] => 1Robert
        )

    [1] => Array
        (
            [0] => 2David
            [1] => 2Samuel
            [2] => 2Fred
            [3] => 2John
        )

    [2] => Array
        (
            [0] => 3David
            [1] => 3Samuel
            [2] => 3Fred
            [3] => 3John
            [4] => 3Frank
        )

)

推荐阅读