-2

问题类似于这个Find an array inside another large 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'

4

1 回答 1

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";
}
于 2012-12-04T15:54:47.643 回答