问题类似于此Find an array inside another larger array
不同之处在于,我不是在搜索值,而是在更大的数组键树中搜索一个小数组键分支。
基本上这是我正在寻找的数组键分支:
$mission_parameters['stmt_echo']['subnodes']['exprs'][0]['expr_constfetch']['subnodes']['name']['name']['subnodes']['parts'][0] = 'true';
数组键树是一个非常大的树,这意味着它是多维的,它可能包含树中任意点的$ mission_parameters。
所以这有点像试图在棕色树上找到一个黄色树枝,它可能有也可能没有黄色树枝。
比较分支末尾的值也是必要的。
我正在查看array_intersect,但它不适用于多维度。有没有人以前解决过这类问题?
请注意,这与在数组中搜索数组不同。我不是在寻找价值观。
- 编辑 -
以下是一个例子:
我正在寻找
array(
'statement' => array(
'statement2' => array(
0 => 'true',
),
),
);
在这样一个更大的数组中:
array(
'statement4' => array(
'statement' => array(
'statement2' => array(
0 => 'true',
),
'statement3' => array(
2 => 'false',
),
),
),
);
您是否看到较小的数组如何成为较大数组的分支。较大的数组当前包含较小的分支,但它具有其他种类的其他元素。因此我正在搜索数组键分支。在此示例中,它将是[statement][statement2][0] = 'true'
答案 0 :(得分:1)
我认为(并且您已经确认)您可以将数据表示为XML结构。在这种情况下,您可以使用XPath查找数据中的任何分支。以下是根据您的问题推断的示例XML数据:
<?xml version="1.0" encoding="utf-8" ?>
<stmt_echo>
<subnodes>
<exprs>
<expr_constfetch>
<subnodes>
<name>
<name>
<subnodes>
<parts>
<part>true</part>
<!-- more items -->
</parts>
</subnodes>
</name>
</name>
</subnodes>
</expr_constfetch>
<!-- more items -->
</exprs>
</subnodes>
</stmt_echo>
这是找到你提到的节点的PHP代码:
$doc = new DOMDocument;
$doc->Load("test.xml");
$xpath = new DOMXPath($doc);
$nodes = $xpath->query("//subnodes/parts[part='true']");
foreach($nodes as $node) {
dumpNodePath($node);
}
# Output
# /stmt_echo/subnodes/exprs/expr_constfetch/subnodes/name/name/subnodes/parts
function dumpNodePath($node) {
$path = array($node->tagName);
while ($node = $node->parentNode) {
if ($node->nodeType != XML_DOCUMENT_NODE) {
$path[] = $node->tagName;
}
}
echo "/" . implode("/", array_reverse($path)) . "\n";
}