2017-06-22 41 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'時,你只搜索具有一個陣列'值:散步後,所收集的值是使用所期望的分離器(/)簡單地加入='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

此外,如果你閱讀這個,搜索鍵值也應該是一個參數,即我想這樣做只爲」排序「,當第一個元素的鍵值」值「 「排序」比應該建立路徑,直到結束,其他人應該被忽略 –

+0

很難解釋這:)謝謝你的幫助無論如何。讓我進一步 –

0

你提的問題是非常嚴重的措辭,但我相信你是嘗試荷蘭國際集團,以實現這一目標:

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