php - 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 文件;有人建议我开始一个新问题。)
解决方案
您可以简单地检查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
)
)
推荐阅读
- material-ui - 使用主题更改 react-select 组件的字体
- python-3.x - jmeter如何记录http(s)脚本记录器以上传xml文件
- javascript - 我将如何处理从 s3.getObject() 引发的未处理异常
- unity3d - 在运行时加载用户定义的文件文件夹?定制收音机
- c++ - C++链表赋值运算符问题
- python - Pygame 用户面板、旋转、边界
- python - 如何在 tkinter 页面上获取整个 sqlite3 查询
- android - GoogleSignInAccount 未登录
- c# - 为什么我不能使用 Marshal.SizeOf() 来计算 ValueTuple 类型实例的大小?
- xml - 如何在 Hive 中使用横向视图分解 XML 数据格式?