拽拽
管理员组

php 使用 array_reduce 实现多维数组分组(groupby)聚合

在处理关联数组时,经常需要对多维数组按指定字段分组聚合,下面封装了一个数组分组聚合方法:


/**

 * 对数组进行分组聚合

 * @param $array

 * @param $keys

 * @return $result

 */

function array_group_by($array, $keys)

{

if(!is_array($keys) || count($keys) == 1)

    {

        $key = is_array($keys) ? array_shift($keys) : $keys;


        return array_reduce($array, function($tmp_result, $item) use ($key)

        {

            $tmp_result[$item[$key]][] = $item;


            return $tmp_result;

        });

    }

    else

    {

        $keys = array_values($keys);


        $result = array_group_by($array, array_shift($keys));


        foreach ($result as $k=>$value)

        {

            $result[$k] = array_group_by($value, $keys);

        }


        return $result;

    }

}


测试


$arr = [

     [

       "first" => "aa",

       "second" => "ccc",

       "third" => "sdfgg",

     ],

     [

       "first" => "aa",

       "second" => "ccc",

       "third" => "dddsa",

     ],

     [

       "first" => "aa",

       "second" => "sdfsdfd",

       "third" => "sdfgg",

     ],

     [

       "first" => "bb",

       "second" => "ccc",

       "third" => "sdfgg",

     ],

     [

       "first" => "bb",

       "second" => "sdfsdfd",

       "third" => "sdfgg",

     ],

   ];

print_r(array_group_by($arr, ['first']));

/*

[

     "aa" => [

       [

         "first" => "aa",

         "second" => "ccc",

         "third" => "sdfgg",

       ],

       [

         "first" => "aa",

         "second" => "ccc",

         "third" => "dddsa",

       ],

       [

         "first" => "aa",

         "second" => "sdfsdfd",

         "third" => "sdfgg",

       ],

     ],

     "bb" => [

       [

         "first" => "bb",

         "second" => "ccc",

         "third" => "sdfgg",

       ],

       [

         "first" => "bb",

         "second" => "sdfsdfd",

         "third" => "sdfgg",

       ],

     ],

   ]

*/

print_r(array_group_by($arr, ['first','second']));

/*

[

     "aa" => [

       "ccc" => [

         [

           "first" => "aa",

           "second" => "ccc",

           "third" => "sdfgg",

         ],

         [

           "first" => "aa",

           "second" => "ccc",

           "third" => "dddsa",

         ],

       ],

       "sdfsdfd" => [

         [

           "first" => "aa",

           "second" => "sdfsdfd",

           "third" => "sdfgg",

         ],

       ],

     ],

     "bb" => [

       "ccc" => [

         [

           "first" => "bb",

           "second" => "ccc",

           "third" => "sdfgg",

         ],

       ],

       "sdfsdfd" => [

         [

           "first" => "bb",

           "second" => "sdfsdfd",

           "third" => "sdfgg",

         ],

       ],

     ],

   ]

#1楼
发帖时间:4月前   |   查看数:0   |   回复数:0
游客组