在更大的数组树中搜索数组键分支 - PHP

时间:2012-12-03 22:21:14

标签: php arrays search recursion tree

问题类似于此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'

1 个答案:

答案 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";
}