簡體   English   中英

遞歸獲取嵌套 PHP 數組中每個節點的父節點列表

[英]Recursively getting a list of parents for each node in a nested PHP array

在 PHP 我有一組嵌套的 arrays 數據。 我想把它們展平,這樣對於每個節點和葉子,我都會得到一個父節點列表。

這是原始數組的一個示例 - 請注意,每個部分的深度和長度都可能未知:

$data = array(
    "name" => "Thing",
    "children" => array(
        array(
            "name" => "Place",
            "rdfs:subClassOf" => "schema:Thing",
            "children" => array(
                array(
                    "name" => "Accomodation",
                    "rdfs:subClassOf" => "schema:Place",
                    "children" => array(
                        array(
                            "name" => "Apartment",
                            "rdfs:subClassOf" => "schema:Accomodation",
                        ),
                        array(
                            "name" => "Hotel",
                            "rdfs:subClassOf" => "schema:Accomodation",
                        ),
                        array(
                            "name" => "House",
                            "rdfs:subClassOf" => "schema:Accomodation",
                        )
                    )
                )
            )
        ),
        array(
            "name" => "CreativeWork",
            "rdfs:subClassOf" => "schema:Thing",
            "children" => array(
                array(
                    "name" => "Article",
                    "rdfs:subClassOf" => "schema:CreativeWork",
                    "children" => array(
                        array(
                            "name" => "NewsArticle",
                            "rdfs:subClassOf" => "schema:Article",
                        ),
                        array(
                            "name" => "OpinionArticle",
                            "rdfs:subClassOf" => "schema:Article",
                        ),
                    )
                )
            )
        )
    )
);

(我實際解析的數據是這個 Schema.org JSON 文件——上面是它的一個最小示例。)

這就是我想要的結果:

$results = array(
    "Place"          => array("Thing"),
    "Accomodation"   => array("Thing", "Place"),
    "Apartment"      => array("Thing", "Place", "Accomodation"),
    "Hotel"          => array("Thing", "Place", "Accomodation"),
    "House"          => array("Thing", "Place", "Accomodation"),
    "CreativeWork"   => array("Thing"),
    "Article"        => array("Thing", "CreativeWork"),
    "NewsArticle"    => array("Thing", "CreativeWork", "Article"),
    "OpinionArticle" => array("Thing", "CreativeWork", "Article"),
);

我假設我需要遞歸調用 function 來構建數組,但到目前為止我運氣不佳。 如果這使它變得更難,這發生在 static 方法中。

快速入門:

class Parser {
public static function parse($input,$prefix = []) {
    $return = $prefix ? [$input['name']=>$prefix] : [];
    if (isset($input['children'])) {
        $prefix[] = $input['name'];
        foreach ($input['children'] as $child) {
            $return += self::parse($child,$prefix);
        }
    }
    return $return;
}
}
var_dump(Parser::parse($data));

您可能需要添加一些檢查和注釋以使其更具可讀性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM