【问题标题】:Searching for an array key branch inside a larger array tree - PHP在更大的数组树中搜索数组键分支 - PHP
【发布时间】:2012-12-03 22:21:13
【问题描述】:

问题类似这个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'

【问题讨论】:

  • 不清楚你想做什么,你的描述没有意义。您正在举例说明您正在寻找什么,但随后忽略了解释它实际上不是您问题的答案。提供一些实际示例数据(不仅仅是您提供的数组元素表达式)和预期结果可能会有所帮助。
  • 为了您的快乐而对其进行了编辑。

标签: php arrays search recursion tree


【解决方案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";
}

【讨论】:

  • 我在火车上的时候就在想这个。为了构建该查询,我需要使用 eval。另一个问题是我无法检查多个分支。就像我的搜索数组不仅仅是一个直接的单向分支,而是它有 2 个端点。
  • 天哪,您是说statement-&gt;statement2-&gt;0 只是一个示例,例如,您将搜索表达式?
  • 这只是一个例子。现在我只搜索具有一个端点的单行分支,并且我正在考虑手动添加更多单行进行测试。但这不是很有效。不知道你所说的表达式是什么意思?大数组结构基本上和我给的样例一样,但要大得多,而且有很多子节点和多个端点。它实际上是对 PHP 脚本进行静态代码分析的抽象语法树。
  • 我有个建议,看看有没有道理。与其构建嵌套的关联数组结构,不如构建一个 XML 结构。这应该是直截了当的。然后使用XPath queries 查找节点。如果您以前没有使用过 XPath,您会惊讶于它让您搜索树的方式。
  • 你是对的。我可以将数据导出为 XML。让我现在试试。
猜你喜欢
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多