将二维数组转换为基于 id-parentId 关系的分层多维数组


Convert 2d array into hierarchical multidimensional array based on id-parentId relationships

我有以下数组。 parentId关键很重要!

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Home
            [parentId] => 
            [children] => 
        )
    [1] => Array
        (
            [id] => 2
            [name] => About
            [parentId] => 
            [children] => 
        )
    [2] => Array
        (
            [id] => 3
            [name] => Services
            [parentId] => 2
            [children] => 
        )
)

下面是我的expected数组结果。你将看到 Services 在 id 为2和服务 parentId 为2About

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Home
            [parentId] => 
            [children] => 
        )
    [1] => Array
        (
            [id] => 2
            [name] => About
            [parentId] => 
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => Services
                            [parentId] => 2
                            [children] => 
                        )
                )
        )
)

我可以用array_walkarray_map轻松foreach做到这一点。

我只是想知道是否有任何function可以在没有foreach loop的情况下连接像 SQL JOIN 这样的数组索引?

所以在我的数组中:id = parentId

试试这个库

https://github.com/erdalceylan/array-join

数据

$users = [
    ["id"=>1, "nick"=>"erdal"],
     (object)["id"=>2, "nick"=>"furkan" ],
    ["id"=>3, "nick"=>"huseyin"],
    ["id"=>4, "nick"=>"hümeyra" ],
    ["id"=>5, "nick"=>"tuba" ],
];
 $items = [
     ["user_id"=>1, "item"=>"kaban", "mmx" => "mmx1"],
    ["user_id"=>1, "item"=>"çorap", "mmx" => "mmx2"],
    ["user_id"=>1, "item"=>"çorap", "mmx" => "mmx3"],
     (object)["user_id"=>1, "item"=>"çorap", "mmx" => "mmx4"],
    ["user_id"=>1, "item"=>"çorap", "mmx" => "mmx5"],
    ["user_id"=>1, "item"=>"çorap", "mmx" => "mmx6"],
    ["user_id"=>2, "item"=>"araba", "mmx" => "mmx7"],
     (object)["user_id"=>9, "item"=>"ev", "mmx" => "mmx8"],
    ["user_id"=>10, "item"=>"yat", "mmx" => "mmx9"],
];
$foods = [
    ["user_id"=>1, "food"=>"iskender"],
    ["user_id"=>2, "food"=>"adana"],
];
$texts = [
    ["user_id"=>1, "text"=>"merhaba"],
    ["user_id"=>15, "text"=>" hi"],
];

用法

$instance = 'ArrayJoin'Builder::newInstance()
    ->select("a.id", "a.nick", "b.item", "d.food")
    ->from($users, "a")
    ->innerJoin($items, "b", new 'ArrayJoin'On("a.id = b.user_id"))
    ->leftJoin($texts, "c", new 'ArrayJoin'On("a.id = c.user_id"))
    ->rightJoin($foods, "d", new 'ArrayJoin'On("b.user_id = d.user_id"))
     ->where("a.id", "a.text", function ($fieldFirs, $fieldSecond){
         return $fieldFirs < 10;
     })
     ->limit(2)
     ->offset(1)
     ->setFetchType('ArrayJoin'Builder::FETCH_TYPE_OBJECT);
 $instance->execute();

输出

 array (
   stdClass::__set_state(array(
      'id' => 1,
      'nick' => 'erdal',
      'item' => 'çorap',
      'food' => 'iskender',
   )),
   stdClass::__set_state(array(
      'id' => 1,
      'nick' => 'erdal',
      'item' => 'çorap',
      'food' => 'iskender',
   )),
 )
数组

就像在图像中一样

    [1][children][0] => Array
                    (
                        [id] => 3
                        [name] => Services
                        [parentId] => 2
                        [children] => 
                    )

我个人会用两个表来做,然后使用一个表根据键引用另一个表。