-2

問題はこれに似ています別のより大きな配列内の配列を見つける

違いは、値を検索する代わりに、大きな配列キー ツリー内の小さな配列キー ブランチを検索していることです。

基本的に、私が探している配列キーブランチは次のとおりです。

$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 に答える