如何使用PHP中输入数组的公共键值对将新数组按数组分组

时间:2020-06-23 09:36:14

标签: php multidimensional-array

我有一个PHP多维数组,其中某些记录(即group_image_id

的一对键值对相同​​)

输入数组-

$arr = 
[
 [0] =>['id' => 1, 'group_image_id' => 4, 'website_id' => 28, 'media_alt' => 'abc' ],
 [1] =>['id' => 2, 'group_image_id' => 4, 'website_id' => 28, 'media_alt' => 'abc' ],
 [2] =>['id' => 3, 'group_image_id' => 4, 'website_id' => 28, 'media_alt' => 'abc' ],

 [3] =>['id' => 4, 'group_image_id' => 5, 'website_id' => 28, 'media_alt' => 'pqr' ],

 [4] =>['id' => 5, 'group_image_id' => 6, 'website_id' => 28, 'media_alt' => 'xyz' ],
 [5] =>['id' => 6, 'group_image_id' => 6, 'website_id' => 28, 'media_alt' => 'xyz' ],
 [6] =>['id' => 7, 'group_image_id' => 6, 'website_id' => 28, 'media_alt' => 'xyz' ],

]

输出数组-

$new_arr = 
[
 [4] =>
    [ 
      ['id' => 1, 'group_image_id' => 4, 'website_id' => 28, 'media_alt' => 'abc' ],
      ['id' => 2, 'group_image_id' => 4, 'website_id' => 28, 'media_alt' => 'abc' ],
      ['id' => 3, 'group_image_id' => 4, 'website_id' => 28, 'media_alt' => 'abc' ]
    ],
 [5] =>
    [ 
      ['id' => 4, 'group_image_id' => 5, 'website_id' => 28, 'media_alt' => 'pqr' ]
    ],
 [6] =>
    [ 
      ['id' => 5, 'group_image_id' => 6, 'website_id' => 28, 'media_alt' => 'xyz' ],
      ['id' => 6, 'group_image_id' => 6, 'website_id' => 28, 'media_alt' => 'xyz' ],
      ['id' => 7, 'group_image_id' => 6, 'website_id' => 28, 'media_alt' => 'xyz' ]
    ]
 
]

我想将其转换为具有group_image_id组的新数组。 为此存在任何内置函数,或者它们如何使它成功。

使用foreach循环可以做到这一点。但我正在寻找内置函数(如果有)。

我尝试了以下解决方案,它对我来说仍然可以正常工作,但是,我很想知道您是否知道相同的内置函数。

$new_arr = [];
foreach($arr as $key=>$val){
   foreach($val as $k=>$v){
       if($k == 'group_image_id'){
           $new_arr[$v][] = $val;
       }
       
   }
    
}

1 个答案:

答案 0 :(得分:0)

据我所知,没有这种功能的等效项。您的方法非常简单,如果我必须做类似的事情,那可能就是我要做的。我不了解您的环境和设置,但是如果您有机会查询数据,则可以在db中而不是在php中进行。

尽管如此,您可以通过删除不必要的内部for循环来改进代码。您只需要组键,不需要其他键和值。像这样:

解决方案

$buffer = [];
foreach($arr as $val) {
    $buffer[$val['group_image_id']][] = $val;
}
print_r($buffer);

这是一个简单的解决方案,可能是最好的。

无论如何,还有其他选择(但它们可能更糟)...

替代我

array_walk就像遍历foreach一样遍历整个数组-您可以在lambda函数中访问$ key和$ value。您需要通过引用传递给lambda的缓冲区,否则它将在函数内部创建一个局部变量$ buffer。您也可以在函数的第一行而不是global $buffer;上写use(&$buffer)

$buffer = [];
array_walk($arr, function($value, $key) use (&$buffer) {
    $buffer[$value['group_image_id']][] = $value;
});
print_r($buffer);

替代II

array_column使您可以从嵌套数组中获取单个键/值对。请记住,这会执行多个for循环,即内部的array_column +您的for循环。

$groupIds = array_column($arr, 'group_image_id'); // => [4, 4, 4, 5, 6, 6, 6]
$buffer = [];
foreach($groupIds as $key => $val) {
    $buffer[$val][] = $arr[$key];
}
print_r($buffer);

除此之外,我想不出一半可行的选择。

相关问题