php – 根据条件对数组进行排序
发布时间:2020-12-13 17:45:45 所属栏目:PHP教程 来源:网络整理
导读:我有以下数组 $records = array( array("postId"="1","grid"="6"),array("postId"="2","grid"="3"),array("postId"="3",array("postId"="4",array("postId"="5",array("postId"="6","grid"="12"),array("postId"="7",); 我想对这个数组进行排序,使得任意数量
我有以下数组
$records = array( array("postId"=>"1","grid"=>"6"),array("postId"=>"2","grid"=>"3"),array("postId"=>"3",array("postId"=>"4",array("postId"=>"5",array("postId"=>"6","grid"=>"12"),array("postId"=>"7",); 我想对这个数组进行排序,使得任意数量的背靠背“网格”的总和等于12. 示例:上面数组中“网格”的值为:6,3,6,12,3 (6 6 = 12),(3 3 3 3 = 12),(12 = 12)因此新订单应为6,12或3,6或6,12 因此,在对数组进行排序后,新数组应如下所示: $records=array( array("postId"=>"1",); 我在php手册中搜索并找到了这些函数:sort,uasort,uksort,usort但我无法弄清楚如何使用它们. 你能告诉我如何用PHP实现这个目的吗? 更新 网格的值总是3或6或12(仅限这三个数字) 问题 $records = array( array("postId"=>"1",array("postId"=>"8",); 解决方法
所以你不是真正的排序,而是重新排序以创建序列.我想你正在尝试做一些固定高度的砖块布局,你需要重新排序以填充每一行,并将其余部分留在最后.使用12,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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |