使用PHP DomDocument逐类循环子元素或逐类循环元素



我需要帮助按类从子节点获取值。考虑以下html:

<div class="category-inner-cont" data-count="1">
<fieldset class="p20 blk-bordered" data-count="1">  
<legend class="legend" style="">
<input type="text" class="category-name" placeholder="Category/Group Name..." name="" value="One">
</legend>
<div class="input-group">
<input type="text" class="category-value" value="one-a">
</div>
<div class="input-group">
<input type="text" class="category-value" value="one-b">
</div>
<div class="input-group">
<input type="text" class="category-value" value="one-c">
</div>
</fieldset>
</div>
<div class="category-inner-cont" data-count="2">
<fieldset class="p20 blk-bordered" data-count="2">  
<legend class="legend" style="">
<input type="text" class="category-name" placeholder="Category/Group Name..." name="" value="Two">
</legend>
<div class="input-group">
<input type="text" class="category-value" value="two-a">
</div>
<div class="input-group">
<input type="text" class="category-value" value="two-b">
</div>
</fieldset>
</div>

我正试图创建一个数组,将".classification internal cont"的每组元素中的每个"类别名称"与相应的"类别值"分组。我有以下php:

$org_contents = $html;
$category_array = [];
$category_names = [];
$cat_value = [];
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->loadHTML($org_contents, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$cPath = new DOMXPath($dom);
$categories = $cPath->query('//input[@class="category-name"]');
foreach ($categories as $key => $cat) {
$cat_values = $cPath->query('//input[ @class="category-value" ]');
foreach ($cat_values as $v => $val) {
$cat_value[] = $val->getAttribute('value');
}
$category_array[$key]['name'] = $cat->getAttribute('value');
$category_array[$key]['values'] = $cat_value;
}

然而,它并没有得到正确的结果。以上产生以下内容:

0: {name: "One", values: ["one-a", "one-b", "one-c", "two-a", "two-b"]}
name: "One"
values: ["one-a", "one-b", "one-c", "two-a", "two-b"]
1: {name: "Two",…}
name: "Two"
values: ["one-a", "one-b", "one-c", "two-a", "two-b", "one-a", "one-b", "one-c", "two-a", "two-b"]

它应该生产

Name: One
Values: [one-a, one-b, one-c]
Name: Two
Values: [two-a, two-b]

有几个问题,其中一个问题是第二个XPath查找所有值,而不知道使用当前类别的上下文。在XPath表达式中使用//告诉XPath使用任何节点来搜索内容(包括父节点(。

因此,该代码使用query()的第二个参数来告诉它从哪里开始,还添加了一些../,因为它需要对结构进行一点备份才能获得值(它们与类别名称属性不在同一节点或父节点中(。

该代码还为每个循环重置$cat_value,这样它就不会保留以前值列表中的值。。。

foreach ($categories as $key => $cat) {
$cat_values = $cPath->query('../..//input[ @class="category-value" ]', $cat);
$cat_value = [];
foreach ($cat_values as $v => $val) {
$cat_value[] = $val->getAttribute('value');
}
$category_array[$key]['name'] = $cat->getAttribute('value');
$category_array[$key]['values'] = $cat_value;
}

最新更新