从多维关联 json 文件中获取 parent 值

Get parent values from multidimensional associative json file

我有一个多 variable-level json 文件,看起来像这个 post 底部的示例。我需要做的是搜索一个特定的值,比方说 "Gap junction" 和 return 所有更高级别 parents 的 "name" 的值,在这个例子中 "Junction"、"Plasma membrane" 和 "Cell"。我需要使用 php 来执行此操作,我想我需要一个递归循环来遍历数组,该数组将每个深度级别的 "name" 值记录到数组中,然后 return 这个 "name" 数组,一旦找到搜索词,但我在实现这一点上有点挣扎。任何帮助将不胜感激。

{
    "name": "Cell",
    "children": [
        {
            "name": "Plasma membrane",
            "children": [
                {
                    "name": "Junction",
                    "children": [
                        {"name": "Adherens junction"},
                        {"name": "Caveola"},
                        {"name": "Gap junction"},
                        {"name": "Lipid raft"},
                        {"name": "Tight junction"}
                    ]
                },
                {"name": "Focal adhesion"}
            ]
        },
        {
            "name": "Vesicle",
            "children": [
                {
                    "name": "Endosome",
                    "children": [
                        {"name": "Early Endosome"},
                        {"name": "Late Endosome"},
                        {"name": "Recyling Endosome"}
                    ]
                },
                { "name": "Microsome"}
            ]
        }
    ]
}

编辑

请求的当前代码。 $found 变量当然也没有按照我的预期工作。此答案的代码是 based/modified:Get Parent and Child depth level from JSON using PHP?

$jsonString = file_get_contents("./information/localization.json");
$jsonArray = json_decode($jsonString);

$currOrganelle = "Gap junction";

$parents = read_tree_recursively($jsonArray, $currOrganelle);

function read_tree_recursively($items, $searchTerm, $result = array(), $level = 0, $found = false) {

    foreach($items as $child) {
        if(!$found) {
            $currName = $child->name;

            if($currName == $searchTerm) {
                $found = true;
                return $result;
            }
            elseif(!empty($child->children)) {
                $result[$level] = $currName;
                $result = read_tree_recursively($child->children, $searchTerm, $result, $level + 1, $found);
                if($found) return $result;
            }
            else {
            }
        }
        else {
            return $result;
        }
    }
}

RecursiveIteratorIteratorRecursiveArrayIterator 类 的解决方案:

// $str - is your initial json string
$decoded = json_decode($str, TRUE);

function getParentNameKeys($arr = [], $needle = "") {
    $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($arr));
    $nameKeys = [];
    foreach ($iterator as $key => $value) {
        if ($value === $needle) {
            $depth = $iterator->getDepth();
            while ($depth--){
                if ($iterator->getSubIterator($depth)->offsetExists('name')) {
                    $nameKeys[] = $iterator->getSubIterator($depth)->offsetGet('name');
                }
            }
        }
    }
    return $nameKeys;
}

$nameKeys = getParentNameKeys($decoded, "Gap junction");
var_dump($nameKeys);
// the output:
array (size=3)
  0 => string 'Junction' (length=8)
  1 => string 'Plasma membrane' (length=15)
  2 => string 'Cell' (length=4)


$nameKeys = getParentNameKeys($decoded, "Early Endosome");
var_dump($nameKeys);
// the output:
array (size=3)
  0 => string 'Endosome' (length=8)
  1 => string 'Vesicle' (length=7)
  2 => string 'Cell' (length=4)

http://php.net/manual/en/class.recursiveiteratoriterator.php