将二维数组根据id-parentId关系转换为分层多维数组

4
我有以下数组。`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] => 
        )

)

以下是我期望的数组结果。您将看到Services位于About下面,其ID为2,服务的父ID为2
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_mapforeach来完成这个任务。

我只是想知道是否有任何类似于SQL JOIN的function可以连接数组索引,而不需要使用foreach loop

因此,在我的数组中:id = parentId


也许可以使用 array_merge_recursive 函数并结合自定义回调函数来实现? - Elias Van Ootegem
@EliasVanOotegem 我认为这与 array_map 相同。 - Alma Do
@AlmaDoMundo:不完全是递归的...但你需要使用 array_map($array, 'array_merge_recursive', $someParam) - Elias Van Ootegem
@EliasVanOotegem 我的意思是你将在 PHP 中使用循环来遍历数组(而 OP 想要避免这种情况)。嗯,几乎每个数组函数都会遍历输入数组(仅仅是在它的 C 实现中 - 也就是说,它对用户是隐藏的)- 所以我不确定为什么这对 OP 如此重要。 - Alma Do
@AlmaDoMundo:嗯,如果OP不想循环,他就不应该写程序 :-P 我看到过另一个类似的问题,基本上:循环是不可避免的...(这个评论显然是针对OP的) - Elias Van Ootegem
@EliasVanOotegem 是的。这是结构化程序定理的一部分 - 它指出每个程序都可以用连续的循环和条件运算符来编写。 - Alma Do
2个回答

1
尝试使用这个库。

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',
   )),
 )

嘿,这太棒了。我可以确认它在 Laravel 5.2 上完美运行。 - windsor
请问您能否审核一下如何提供个人开源库?并确保清楚地表明这是您自己的项目吗? - Martijn Pieters
你可以使用一个运行时的 PHP SQL 库。https://github.com/whizsid/arraybase - Ramesh Kithsiri HettiArachchi

0

将数组排列类似于图像中的方式。

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

我个人会用两个表来实现,然后根据关键字使用一个表来引用另一个表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接