Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
378 views
in Technique[技术] by (71.8m points)

Searching for an array key branch inside a larger array tree - PHP

The problem is similar to this Find an array inside another larger array

The differences are that instead of searching for values, I'm searching for a small array key branch inside a larger array key tree.

Basically here's the array key branch that I'm looking for:

$mission_parameters['stmt_echo']['subnodes']['exprs'][0]['expr_constfetch']['subnodes']['name']['name']['subnodes']['parts'][0] = 'true';

The array key tree is a very large tree which means it is multidimensional, and it may include $mission_parameters at any point in the tree.

So it's kind of like trying to find a yellow tree branch in a brown tree which may or may not have a yellow tree branch.

Comparing the value at the end of the branch is also necessary.

I'm looking at array_intersect, but it doesn't work on multidimensions. Has anyone solved this kind of problem before?

Note this is not the same as searching array within an array. I'm not searching values.

--EDIT--

Here's an example:

I'm looking for

array(
    'statement' => array(
        'statement2' => array(
            0 => 'true',
        ),
    ),
);

Inside a larger array like this:

array(
    'statement4' => array(
        'statement' => array(
            'statement2' => array(
                0 => 'true',
            ),
            'statement3' => array(
                2 => 'false',
            ),
        ),
    ),
);

Do you see how the smaller array is like a branch to the larger array. The larger array currently contains the smaller branch, but it has other sorts of other elements. Therefore I'm searching an array key branch. In this example it would be [statement][statement2][0] = 'true'

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I think (and you have confirmed) that you can represent your data as an XML structure. I this case, you can use XPath to find any branch in your data. Here is sample XML data inferred from your question:

<?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>

And here is the PHP code to locate the node you mentioned:

$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)) . "
";
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...