【问题标题】:PHP - Array - Recursively print each full branch (up to leaf/leaves) of the nested array (Tree) as an XpathPHP - 数组 - 将嵌套数组(树)的每个完整分支(直到叶子/叶子)递归打印为 Xpath
【发布时间】:2017-06-22 12:11:55
【问题描述】:

有这个代码:

$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

任何人都知道如何计算嵌套数组的数量,知道何时停止,分支在哪里结束?另外如何指定只搜索“sort”,不应该出现分支“mort”和“bort”。

输出应该是,基于搜索“排序”:

/sort/=/_GET/sort

所以我认为伪代码应该是这样的:

  1. 在“body”数组中查找键“value”等于搜索内容(即“sort”)
  2. 获取所有兄弟姐妹和孩子,孩子的孩子等键“值”值,直到分支结束。
  3. 打印分支
  4. 转到下一个正文项的 1

谢谢,

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      • 2021-12-14
      • 2021-02-13
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多