我有一个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;
}
}
}
答案 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);
除此之外,我想不出一半可行的选择。