我有一个数组,我想通过将相同的值分组在一起将其转换为二维数组。
一旦所有具有相同值的元素都被推入组中,我想使用该组来做某事,然后继续循环并设置下一组,直到原始
$array
的所有内容都已被使用。
public function adjust($array){
// $array = [1, 1, 2, 2, 8, 8, 8, 9, 20]
$group = array()
for ($i = 0; $i < sizeof($array); $i++){
// code here
// result should be $group = [1, 1]
// use $group for something, reset its contents,
// continue loop until group is [2, 2],
// rinse and repeat
}
}
我不一定需要循环,我只需要能够将
$array
切成 5 $groups
(对于这个特定示例),以便能够处理数据。
有没有一种更简单的方法来解决这个问题,而无需一堆 if/else 条件?
将
$chunk
初始化为包含第一个元素的数组。然后循环遍历数组的其余部分,将当前元素与 $chunk
中的元素进行比较。如果不同,处理$chunk
并重置。
$chunk = array[$array[0]];
for ($i = 1; $i < count($array); $i++) {
if ($array[$i] != $chunk[0]) {
// use $chunk for something
$chunk = array($array[$i]);
} else {
$chunk[] = $array[$i];
}
}
// process the last $chunk here when loop is done
array_count_values
更可能是您想要的。
$array = [1, 1, 2, 2, 8, 8, 8, 9, 20];
foreach (array_count_values($array) as $val => $count) {
$chunk = array_fill(0, $count, $val); // contains [1, 1], [2, 2], etc.
}
这可以在没有任何条件的情况下完成,并且无需使用
array_count_values()
进行预先分组。不需要迭代函数调用。当您将每个值推入其自己的专用子数组时,只需将每个值用作临时分组键即可。即使重复值不连续,此技术也会对值进行分组。如果您想删除临时钥匙,只需拨打array_values()
即可。
语言构造循环:(演示)
$result = [];
foreach ($array as $value) {
$result[$value][] = $value;
}
var_export(array_values($result));
功能循环:(演示)
var_export(
array_values(
array_reduce(
$array,
function($result, $value) {
$result[$value][] = $value;
return $result;
},
[]
)
)
);
两者都输出以下数据结构:
[[1, 1], [2, 2], [8, 8, 8], [9], [20]]