繁体   English   中英

PHP-数组-根据键访问同级/子键值

[英]PHP - Array - Access siblings/child key values based on key

具有以下数组(作为JSON):

{
  "token_name": "C_ROOT",
  "token_group": "C_BLOCK",
  "group": true,
  "body": [
    [
      {
        "token_name_org": "T_VARIABLE",
        "token": 320,
        "value": "sort",
        "line": 2,
        "token_group": "VARIABLES",
        "token_name": "C_VARIABLE"
      },
      {
        "token_name_org": "C_ASSIGNMENT_EQUAL",
        "line": 2,
        "value": "=",
        "token": "VALUE",
        "token_group": "ASSIGNMENTS"
      },
      {
        "token_name_org": "T_VARIABLE",
        "token": 320,
        "value": "_GET",
        "line": 2,
        "token_group": "VARIABLES",
        "token_name": "C_VARIABLE",
        "args": [
          [
            {
              "token_name_org": "T_CONSTANT_ENCAPSED_STRING",
              "token": 323,
              "value": "sort",
              "line": 2,
              "token_group": "STRINGS",
              "token_name": "C_STRING"
            }
          ]
        ]
      }
    ]
  ]
}

编写此代码以搜索作为“ sort”的键“ value”。

    public function search_var($array,$var)
    {


        foreach($array as $key=>$value)
        {

            if(is_array($value))
            {

                $this->search_var($value,$var);

            }else{
                if(isset($array["value"]) && $array["value"] == $var)
                {
                    print $value."\n";
                }   


            }

        }

    }

  print_r($scanner->search_var($map,"sort"));

不知道如何在我的代码中引用兄弟姐妹和孩子?

现在的输出是:

T_VARIABLE
320
sort
2
VARIABLES
C_VARIABLE

如何使我只能看到输出:

/sort/=/_GET/sort

“ /”之间的每个值都是同级或子级中的关键“值”(最后一种情况)

谢谢,

从问题中尚不清楚,当body包含的信息比问题中张贴的信息多时,该返回什么。 此答案假定它永远不会做。

一种可能的解决方案是使用array_walk_recursive()并将与value键关联的value收集到数组中。 步行后,使用所需的分隔符( / )将收集的值简单地合并在一起:

$text = '{"token_name":"C_ROOT","token_group":"C_BLOCK","group":true,"body":[[{"token_name_org":"T_VARIABLE","token":320,"value":"sort","line":2,"token_group":"VARIABLES","token_name":"C_VARIABLE"},{"token_name_org":"C_ASSIGNMENT_EQUAL","line":2,"value":"=","token":"VALUE","token_group":"ASSIGNMENTS"},{"token_name_org":"T_VARIABLE","token":320,"value":"_GET","line":2,"token_group":"VARIABLES","token_name":"C_VARIABLE","args":[[{"token_name_org":"T_CONSTANT_ENCAPSED_STRING","token":323,"value":"sort","line":2,"token_group":"STRINGS","token_name":"C_STRING"}]]}],[{"token_name_org":"T_VARIABLE","token":320,"value":"mort","line":2,"token_group":"VARIABLES","token_name":"C_VARIABLE"},{"token_name_org":"C_ASSIGNMENT_EQUAL","line":2,"value":"=","token":"VALUE","token_group":"ASSIGNMENTS"},{"token_name_org":"T_VARIABLE","token":320,"value":"_GET","line":2,"token_group":"VARIABLES","token_name":"C_VARIABLE","args":[[{"token_name_org":"T_CONSTANT_ENCAPSED_STRING","token":323,"value":"mort","line":2,"token_group":"STRINGS","token_name":"C_STRING"}]]}]]}';

$array = json_decode($text, TRUE);


// Collect the values here.
// Start with an empty string to force a leading '/' in the output
$path = array('');
// Walk the array, put the desired values in $path
array_walk_recursive(
    $array,
    function($value, $key) use (&$path) {      // use reference to modify $path inside the function
        if ($key == 'value') {
            $path[] = $value;
        }
    }
);

// Join the collected values and output the result
echo(implode('/', $path));

您的问题措辞很差,但我相信您正在努力实现这一目标:

public function search_var($array,$var) {
    foreach($array as $key=>$value) {
        if(is_array($value)) {
            $this->search_var($value,$var);
        } elseif($key == $var) {
            print "/".$value;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM