【问题标题】:Join multidimensional array like SQL加入多维数组,如 SQL
【发布时间】:2013-09-25 19:02:02
【问题描述】:

我有以下数组。 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 位于About 下,其id 为2,services parentId 为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 轻松做到这一点。

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

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

【问题讨论】:

  • 也许使用array_merge_recursive 使用用户定义的回调?
  • @EliasVanOotegem 我认为这与 array_map 相同
  • @AlmaDoMundo:不完全是,因为它不是递归的......但你不能使用array_map($array, 'array_merge_recursive', $someParam)
  • @EliasVanOotegem 我的意思是您将使用 PHP 中的数组迭代(而 OP 希望避免这种情况)。好吧,几乎每个数组函数都遍历输入数组(只是在它的 C 实现中——即它对用户隐藏)——所以我不确定为什么它对 OP 如此重要。
  • @AlmaDoMundo:好吧,如果 OP 不想循环,他不应该编程 :-P I've seen another question like this,基本上:循环是不可避免的......(该评论是为了OP,显然)

标签: php arrays multidimensional-array


【解决方案1】:

像在图像中那样排列数组。

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

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

【讨论】:

    【解决方案2】:

    试试这个库

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2015-12-21
    • 2017-10-07
    相关资源
    最近更新 更多