我有以下数组
Array
(
[0] => Array
(
[id] => 96
[shipping_no] => 212755-1
[part_no] => reterty
[description] => tyrfyt
[packaging_type] => PC
)
[1] => Array
(
[id] => 96
[shipping_no] => 212755-1
[part_no] => dftgtryh
[description] => dfhgfyh
[packaging_type] => PC
)
[2] => Array
(
[id] => 97
[shipping_no] => 212755-2
[part_no] => ZeoDark
[description] => s%c%s%c%s
[packaging_type] => PC
)
)
Run Code Online (Sandbox Code Playgroud)
我该如何对数组进行分组id
?是否有任何本机PHP功能可用于执行此操作?
如果我foreach
上面那么我会得到一个重复的,我怎么能避免这个?
在上面的例子中id
有2个项目,所以它需要在里面id
.
编辑:一切工作精细:但有一种方式可以一个人实现相同的目标吗?
xda*_*azz 129
没有原生的,只需使用循环.
$result = array();
foreach ($data as $element) {
$result[$element['id']][] = $element;
}
Run Code Online (Sandbox Code Playgroud)
Bab*_*aba 32
您可以尝试以下方法:
$group = array();
foreach ( $array as $value ) {
$group[$value['id']][] = $value;
}
var_dump($group);
Run Code Online (Sandbox Code Playgroud)
输出:
array
96 =>
array
0 =>
array
'id' => int 96
'shipping_no' => string '212755-1' (length=8)
'part_no' => string 'reterty' (length=7)
'description' => string 'tyrfyt' (length=6)
'packaging_type' => string 'PC' (length=2)
1 =>
array
'id' => int 96
'shipping_no' => string '212755-1' (length=8)
'part_no' => string 'dftgtryh' (length=8)
'description' => string 'dfhgfyh' (length=7)
'packaging_type' => string 'PC' (length=2)
97 =>
array
0 =>
array
'id' => int 97
'shipping_no' => string '212755-2' (length=8)
'part_no' => string 'ZeoDark' (length=7)
'description' => string 's%c%s%c%s' (length=9)
'packaging_type' => string 'PC' (length=2)
Run Code Online (Sandbox Code Playgroud)
And*_*law 18
我只是把它扔在一起,受.NET LINQ的启发
<?php
// callable type hint may be "closure" type hint instead, depending on php version
function array_group_by(array $arr, callable $key_selector) {
$result = array();
foreach ($arr as $i) {
$key = call_user_func($key_selector, $i);
$result[$key][] = $i;
}
return $result;
}
$data = array(
array(1, "Andy", "PHP"),
array(1, "Andy", "C#"),
array(2, "Josh", "C#"),
array(2, "Josh", "ASP"),
array(1, "Andy", "SQL"),
array(3, "Steve", "SQL"),
);
$grouped = array_group_by($data, function($i){ return $i[0]; });
var_dump($grouped);
?>
Run Code Online (Sandbox Code Playgroud)
瞧,你得到了
array(3) {
[1]=>
array(3) {
[0]=>
array(3) {
[0]=>
int(1)
[1]=>
string(4) "Andy"
[2]=>
string(3) "PHP"
}
[1]=>
array(3) {
[0]=>
int(1)
[1]=>
string(4) "Andy"
[2]=>
string(2) "C#"
}
[2]=>
array(3) {
[0]=>
int(1)
[1]=>
string(4) "Andy"
[2]=>
string(3) "SQL"
}
}
[2]=>
array(2) {
[0]=>
array(3) {
[0]=>
int(2)
[1]=>
string(4) "Josh"
[2]=>
string(2) "C#"
}
[1]=>
array(3) {
[0]=>
int(2)
[1]=>
string(4) "Josh"
[2]=>
string(3) "ASP"
}
}
[3]=>
array(1) {
[0]=>
array(3) {
[0]=>
int(3)
[1]=>
string(5) "Steve"
[2]=>
string(3) "SQL"
}
}
}
Run Code Online (Sandbox Code Playgroud)
ato*_*mrc 18
在更具功能性的编程风格中,您可以使用 array_reduce
$groupedById = array_reduce($data, function (array $accumulator, array $element) {
$accumulator[$element['id']][] = $element;
return $accumulator;
}, []);
Run Code Online (Sandbox Code Playgroud)
小智 8
消费并缓存要分组的列值,然后将剩余数据作为您在结果中创建的组的新子数组推送。
function array_group(array $data, $by_column)
{
$result = [];
foreach ($data as $item) {
$column = $item[$by_column];
unset($item[$by_column]);
$result[$column][] = $item;
}
return $result;
}
Run Code Online (Sandbox Code Playgroud)
如果您需要具有全套测试的 Composer 替代方案,则array_group_by函数可以实现您的需求。完全披露:我是该库的作者。
$grouped = array_group_by($arr, 'id');
Run Code Online (Sandbox Code Playgroud)
它还支持多级分组,甚至通过使用自定义回调函数进行复杂分组:
// Multilevel grouping
$grouped = array_group_by($arr, 'id', 'part_no');
// Grouping by a callback/callable function
$grouped = array_group_by($records, function ($row) {
return $row->city;
});
Run Code Online (Sandbox Code Playgroud)