2017-06-22 32 views
-1

有這樣的代碼:PHP - 陣列 - 以遞歸方式打印每個全分支(高達葉/葉)嵌套陣列(樹)作爲XPath的

$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"}]]}],[{"token_name_org":"T_VARIABLE","token":320,"value":"bort","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":"bort","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)); 

它穿過陣列(樹),並打印Xpath的每個分支,直到葉子:

美化數組作爲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" 
      } 
      ] 
     ] 
     } 
    ], 
    [ 
     { 
     "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" 
      } 
      ] 
     ] 
     } 
    ], 
    [ 
     { 
     "token_name_org": "T_VARIABLE", 
     "token": 320, 
     "value": "bort", 
     "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": "bort", 
       "line": 2, 
       "token_group": "STRINGS", 
       "token_name": "C_STRING" 
      } 
      ] 
     ] 
     } 
    ] 
    ] 
} 

輸出:

/sort/=/_GET/sort/mort/=/_GET/mort/bort/=/_GET/bort 

任何人都有一個想法如何計算嵌套數組的數量,知道什麼時候停止,分支在哪裏結束?另外,如何指定僅搜索「排序」,不應出現分支「mort」和「bort」。

輸出應該是基於搜索「排序」:

/sort/=/_GET/sort 

所以僞代碼應該我覺得是這樣的:

  1. 查找「身體」陣列鍵「值「等於什麼搜索(即」排序「)
  2. 獲取所有的兄弟姐妹和兒童,兒童的孩子等關鍵」價值「的價值,直到分支結束。
  3. 打印分支
  4. 轉到1下身子項目

感謝,

回答

1

首先,你必須確定包含value == 'sort'然後應用現有代碼的body該項目(提取它的功能第一個):

$search = 'sort'; 

// Identify the items having 'value' associated with $search 
$allItems = array_filter(
    $array['body'], 
    function (array $item) use ($search) { 
     // $item contains many tokens, keep $item if the first token has value == 'sort' 
     // just to be sure you can also check here if $item[0]['token'] is 320 or the value of 'token_org_name' 
     return $item[0]['value'] == $search; 
    } 
); 

// Pass all the found items to the function that produces the path 
foreach ($allItems as $item) { 
    echo(getPath($item)."\n"); 
} 


function getPath(array $array) { 
    // 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) { 
      if ($key == 'value') { 
       $path[] = $value; 
      } 
     } 
    ); 

    // Join the collected values and return the result 
    return implode('/', $path); 
} 
+0

很好的解釋,評論和代碼。謝謝!!! –