我有一个多维数组,并试图根据特定列中的值对它们进行分组。
我正在尝试按
level
对它们进行分组,但实际上我事先并不知道级别。所以,我不能把它放在 for
循环中然后说 while $i < 7
,因为我不知道 7
是关卡键的最大值,坦率地说,我不确定这是怎么回事即使我这样做,我也需要这样做。
[
['cust' => 'XT8900', 'type' => 'standard', 'level' => 1],
['cust' => 'XT8944', 'type' => 'standard', 'level' => 1],
['cust' => 'XT8922', 'type' => 'premier', 'level' => 3],
['cust' => 'XT8816', 'type' => 'permier', 'level' => 3],
['cust' => 'XT7434', 'type' => 'standard', 'level' => 7],
]
期望的结果:
Array (
[1] => Array (
[0] => Array (
[cust] => XT8900
[type] => standard
)
[1] => Array (
[cust] => XT8944
[type] => standard
)
)
[3] => Array (
[2] => Array (
[cust] => XT8922
[type] => premier
)
[3] => Array (
[cust] => XT8816
[type] => permier
)
)
[7] => Array (
[4] => Array (
[cust] => XT7434
[type] => standard
)
)
)
最好的方法,如果您可以控制构建初始数组,那么只需在添加条目时像开始时那样设置。
如果没有则建立一个临时数组进行排序:
foreach ($input_arr as $key => &$entry) {
$level_arr[$entry['level']][$key] = $entry;
}
留下你想要的形式和所有参考的东西。
如果可能的话,首先像那样构建数组。
您需要先按level对它们进行分组
使用 foreach 循环到数组中检查级别是否与前一项相同然后将其与该数组分组
$templevel=0;
$newkey=0;
$grouparr[$templevel]="";
foreach ($items as $key => $val) {
if ($templevel==$val['level']){
$grouparr[$templevel][$newkey]=$val;
} else {
$grouparr[$val['level']][$newkey]=$val;
}
$newkey++;
}
print($grouparr);
print($grouparr); 的输出将显示为您希望的格式
你也可以试试
print($grouparr[7]);
会展示
[7] => Array (
[4] => Array (
[cust] => XT7434
[type] => standard
)
)
或
print($grouparr[3]);
会展示
[3] => Array (
[2] => Array (
[cust] => XT8922
[type] => premier
)
[3] => Array (
[cust] => XT8816
[type] => permier
)
)
这是我针对相同问题找到的解决方案,包装为一个函数:
function arraySort($input,$sortkey){
foreach ($input as $key=>$val) $output[$val[$sortkey]][]=$val;
return $output;
}
要按名为“级别”的键对 $myarray 进行排序,只需执行以下操作:
$myArray = arraySort($myArray,'level');
或者,如果您不想将它作为一个函数,仅供一次性使用,这将从 $myArray 按键“level”分组创建 $myNewArray
foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val;
function group_assoc($array, $key) {
$return = array();
foreach($array as $v) {
$return[$v[$key]][] = $v;
}
return $return;
}
//Group the requests by their account_id
$account_requests = group_assoc($requests, 'account_id');
要从示例输入中生成问题所需的确切输出,请从每行中拉出/弹出最后一个值,将该值用作第一级分组键。然后使用原来的一级索引作为二级键。然后将剩余的两个元素推入组的子集中。
代码:(演示)
$result = [];
foreach ($array as $key => $row) {
$result[array_pop($row)][$key] = $row;
}
var_export($result);
对于函数式语法,使用
array_reduce()
。 (演示)
var_export(
array_reduce(
array_keys($array),
function($result, $key) use ($array) {
$result[array_pop($array[$key])][$key] = $array[$key];
return $result;
}
)
);
$result = array();
foreach ($yourArrayList as $data) {
$id = $data['level'];
if (isset($result[$id])) {
$result[$id][] = $data;
} else {
$result[$id] = array($data);
}
}
最佳答案
$levels = array_unique(array_column($records, 'level'));
$data = array();
foreach($records as $key => $value){
$data[$levels[array_search($value['level'],$levels )]][] = $value ;
}
print_r($data);
function _group_by($array,$key,$keyName)
{
$return = array();
foreach($array as $val) {
$return[$keyName.$val[$key]][] = $val;
}
return $return;
} //end of function