"1","grid"=>"6"), array("postId"=>"2","grid"=>"3"),-6ren">
gpt4 book ai didi

php - 根据条件对数组进行排序

转载 作者:可可西里 更新时间:2023-10-31 22:12:11 24 4
gpt4 key购买 nike

我有以下数组

$records = array(

array("postId"=>"1","grid"=>"6"),
array("postId"=>"2","grid"=>"3"),
array("postId"=>"3","grid"=>"6"),
array("postId"=>"4","grid"=>"3"),
array("postId"=>"5","grid"=>"3"),
array("postId"=>"6","grid"=>"12"),
array("postId"=>"7","grid"=>"3"),

);

我想以任意数量的背靠背“网格”之和等于 12 的方式对这个数组进行排序。

例子:上面数组中“grids”的值是:6,3,6,3,3,12,3

(6+6=12), (3+3+3+3=12),(12=12) 所以新的顺序应该是 6,6,3,3,3,3,12 3,3,3,3,12,6,66,3,3,6,3,3,12

所以在对数组排序后,新数组应该如下所示:

$records=array(

array("postId"=>"1","grid"=>"6"),
array("postId"=>"3","grid"=>"6"),
array("postId"=>"2","grid"=>"3"),
array("postId"=>"4","grid"=>"3"),
array("postId"=>"5","grid"=>"3"),
array("postId"=>"7","grid"=>"3"),
array("postId"=>"6","grid"=>"12"),

);

我在 php 手册中搜索并找到了这些函数:sort、uasort、uksort、usort 但我不知道如何使用它们。

能否请您告诉我如何使用 PHP 实现此目的?

更新

grid的值永远是3或6或12(仅限这三个数)

问题

  $records = array(

array("postId"=>"1","grid"=>"3"),
array("postId"=>"2","grid"=>"6"),
array("postId"=>"3","grid"=>"3"),
array("postId"=>"4","grid"=>"3"),
array("postId"=>"5","grid"=>"6"),
array("postId"=>"6","grid"=>"6"),
array("postId"=>"7","grid"=>"3"),
array("postId"=>"8","grid"=>"6"),

);

最佳答案

所以你并不是真正的排序,而是重新排序以创建序列。我想你正在尝试做一些固定高度的砖 block 布局,你需要重新排序以填充每一行并将其余部分留在最后。对于 12,6,3 的给定固定变体,可以通过按降序对其进行排序来完成 - 对于奇数个 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;
}

关于php - 根据条件对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18990802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com