如何递归排序关联数组

我想对以下关联数组进行排序:


$tree = [

  "id" => 245974,

  "children" => [

    [

      "id" => 111

    ],

    [

      "id" => 245982,

      "children" => [

        [

          "id" => 246093,

          "children" => [

            [

              "id" => 225892

            ],

            [

              "id" => 225893

            ],

            [

              "id" => 225902

            ]

          ]

        ]

      ]

    ]

  ]

];

在id=>的“搜索值”之后所需的排序顺序225902:

[

  "id" => 245974,

  "children" => [

    [

      "id" => 245982, // <-- this is moved up

      "children" => [

        [

          "id" => 246093,

          "children" => [

            [

              "id" => 225902 // <-- this is moved up

            ],

            [

              "id" => 225892

            ],

            [

              "id" => 225893

            ]

          ]

        ]

      ]

    ],

    [

      "id" => 111

    ]

  ]

];

我试过的:

<?php


$category_id = 225902;


function custom_sort(&$a, &$b) {

  global $category_id;


  if ($a['id'] === $category_id) {

    return -1;

  }


  if ($b['id'] === $category_id) {

    return 1;

  }


  if (array_key_exists('children', $a)) {

    if (usort($a['children'], "custom_sort")) {

      return -1;

    }

  }


  if (array_key_exists('children', $b)) {

    if (usort($b['children'], "custom_sort")) {

      return 1;

    }

  }


  return 0;

}


function reorder_tree($tree) {

  usort($tree['children'], "custom_sort");

  return $tree;

}


echo "<pre>";

var_dump(reorder_tree($tree));

echo "</pre>";


犯罪嫌疑人X
浏览 127回答 1
1回答

幕布斯7119047

伟大的尝试,而且非常在正确的轨道上。比较器中递归的问题在于,usort当数组长度为 1 时不会调用比较器函数,因此是否探索整棵树是usort. 这将放弃id => 245982树的分支。解决方案是避免usort直接在的比较器函数中递归。相反,使用usort根据需要调用的常规递归函数,即当前数组或子数组包含目标 id。我使用一个单独的数组来跟踪哪些元素应该向前移动,但是如果您愿意,您可以跳出循环并将单个元素拼接/取消移动到前面。我们还可以为$category_id函数设置一个参数。这是一种方法:function reorder_tree_r(&$children, $target) {&nbsp; &nbsp; $order = [];&nbsp; &nbsp; $should_sort = false;&nbsp; &nbsp; foreach ($children as $i => &$child) {&nbsp; &nbsp; &nbsp; &nbsp; $order[$i] = false;&nbsp; &nbsp; &nbsp; &nbsp; if (array_key_exists("children", $child) &&&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reorder_tree_r($child["children"], $target) ||&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $child["id"] === $target) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $order[$i] = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $should_sort = true;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; if ($should_sort) {&nbsp; &nbsp; &nbsp; &nbsp; $priority = [];&nbsp; &nbsp; &nbsp; &nbsp; $non_priority = [];&nbsp; &nbsp; &nbsp; &nbsp; for ($i = 0; $i < count($children); $i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ($order[$i]) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $priority[]= $children[$i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $non_priority[]= $children[$i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; $children = array_merge($priority, $non_priority);&nbsp; &nbsp; }&nbsp; &nbsp; return $should_sort;}function reorder_tree($tree, $target) {&nbsp; &nbsp; if (!$tree || !array_key_exists("children", $tree)) {&nbsp; &nbsp; &nbsp; &nbsp; return $tree;&nbsp; &nbsp; }&nbsp; &nbsp; reorder_tree_r($tree["children"], $target);&nbsp; &nbsp; return $tree;}var_export(reorder_tree($tree, 225902));输出:array (&nbsp; 'id' => 245974,&nbsp; 'children' =>&nbsp;&nbsp; array (&nbsp; &nbsp; 0 =>&nbsp;&nbsp; &nbsp; array (&nbsp; &nbsp; &nbsp; 'id' => 245982,&nbsp; &nbsp; &nbsp; 'children' =>&nbsp;&nbsp; &nbsp; &nbsp; array (&nbsp; &nbsp; &nbsp; &nbsp; 0 =>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; array (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'id' => 246093,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'children' =>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 =>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'id' => 225902,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 =>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'id' => 225892,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2 =>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; array (&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 'id' => 225893,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ),&nbsp; &nbsp; &nbsp; &nbsp; ),&nbsp; &nbsp; &nbsp; ),&nbsp; &nbsp; ),&nbsp; &nbsp; 1 =>&nbsp;&nbsp; &nbsp; array (&nbsp; &nbsp; &nbsp; 'id' => 111,&nbsp; &nbsp; ),&nbsp; ),
打开App,查看更多内容
随时随地看视频慕课网APP