所以你不是真正的排序,而是重新排序以创建序列.我想你正在尝试做一些固定高度的砖块布局,你需要重新排序以填充每一行,并将其余部分留在最后.使用12,6,3的给定固定变体,可以通过按降序对其进行排序来完成 – 奇数个六,它将填充较小的三个.然而,这样的顺序将产生无聊的布局 – 让它更有趣你只需要重新排序一些帖子.为此,您需要创建临时容器并在其网格总和等于12时合并它.如果您留下一些临时容器,请将它们合并为一个并在与先前分组合并之前按降序排序.
代码说明我的概念:
//auxiliary function to calculate sum of grids in given temporary container
function reduc($a) {
return array_reduce($a, function ($result, $item) {
return $result . $item['grid'] . ',';
}, '');
}
function regroup($records, $group_sum = 12) {
$temp = array();
$grouped = array();
foreach ($records as $r) {
if ($r['grid'] == $group_sum) {
$grouped[] = $r;
} else {
if (!$temp) {
$temp[] = array($r);
} else {
$was_grouped = false;
foreach ($temp as $idx => $container) {
$current_sum = sum_collection($container);
if ($current_sum + $r['grid'] <= $group_sum) {
$temp[$idx][] = $r;
if ($current_sum + $r['grid'] == $group_sum) {
$grouped = array_merge($grouped, $temp[$idx]);
unset($temp[$idx]);
}
$was_grouped = true;
break;
}
}
if (!$was_grouped) {
$temp[] = array($r);
}
}
}
}
if ($temp) {
//Sort descending, so biggest ones will be filled first with smalller
$rest = call_user_func_array('array_merge', $temp);
usort($rest, function($a, $b) {
return $b['grid'] - $a['grid'];
});
$grouped = array_merge($grouped, $rest);
}
return $grouped;
}