2017-06-22 37 views
0

に基づいてアクセス兄弟/子キーの値が(JSONなど)は、この配列を持っている:PHP - 配列 - キー

{ 
    "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" 
      } 
      ] 
     ] 
     } 
    ] 
    ] 
} 

は、「並べ替え」であるキー「値」を検索するには、このコードを書きました。

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 

兄弟で「/」キー「値」であるとの各値または子(最後のケース)

おかげで、

+0

出力がいかに '/ソート/ =/_ GET/sort'だけつのアレイを有するの検索'値:徒歩後、収集された値は、単に、所望の分離(/)を使用して接合されています= '並べ替え'? – Jeff

+0

この関数は何も返さないので、最後の行は何も印刷しません – Jeff

+0

再帰関数をどのように書いているのか分かりにくいので、キーと値を選択できませんでした。これは宿題の質問ですか? –

答えて

1

それはbodyが質問に投稿されたものよりもより多くの情報が含まれている場合に返すためにどのような質問から明らかではありません。この答えは決してそれがないと仮定します。

可能な解決策は、array_walk_recursive()を使用して、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)); 
+0

ほぼ完璧な答え!!!!ありがとう!!それは分かりません。ちょっとした疑問:各パスが新しい行に表示されるようにする方法は、 "/ sort/=/_ GET/sort/mort/=/_ GET/mort"は "/ sort/=/_ GET /ソート\ n/mort/=/_ GET/mort " –

+0

また、あなたがこれを読んだ場合、検索キーの値もパラメータでなければなりません。つまり、最初の要素が値のキー" value "を持っているときに" sort " "並べ替える"よりも最後までパスを構築する必要があります他は無視する必要があります –

+0

これは説明しにくい:)とにかくおかげでありがとう。さらに私は –

0

あなたの質問は非常に悪い言葉遣いが、私はあなたがしようとしていると信じていますこれを達成するためにINGの:

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; 
     } 
    } 
}