php - 在 php 中对这个数组进行排序的最佳方法是什么?

标签 php arrays sorting

如果不求助于可笑的自定义函数组合,我无法为这个问题想出任何理智的解决方案。或许您可以就此提供一些新鲜的想法。

我有以下(简化的)数组

Array
(
    [0] => Array
        (
            [vid_id] => 420037
            [vid_rating] => 2.93827
            [vid_quality] => 2
            [vid_special] => 1
            [vid_weight] => 0
            [vid_position] => 0
            [vid_position_end] => 0
        )

    [1] => Array
        (
            [vid_id] => 420040
            [vid_rating] => 3
            [vid_quality] => 1
            [vid_special] => 1
            [vid_weight] => 0
            [vid_position] => 0
            [vid_position_end] => 0
        )

    [2] => Array
        (
            [vid_id] => 426455
            [vid_rating] => 3.25581
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 5
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [3] => Array
        (
            [vid_id] => 429804
            [vid_rating] => 3
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 0
            [vid_position] => 0
            [vid_position_end] => 0
        )

    [4] => Array
        (
            [vid_id] => 420848
            [vid_rating] => 2.94444
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 3
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [5] => Array
        (
            [vid_id] => 420859
            [vid_rating] => 2.73077
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 4
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [6] => Array
        (
            [vid_id] => 420524
            [vid_rating] => 2.41379
            [vid_quality] => 2
            [vid_special] => 0
            [vid_weight] => 5
            [vid_position] => 2
            [vid_position_end] => 2
        )

    [7] => Array
        (
            [vid_id] => 419810
            [vid_rating] => 3.13393
            [vid_quality] => 1
            [vid_special] => 0
            [vid_weight] => 0
            [vid_position] => 0
            [vid_position_end] => 0
        )

    [8] => Array
        (
            [vid_id] => 419851
            [vid_rating] => 2.97802
            [vid_quality] => 1
            [vid_special] => 0
            [vid_weight] => 5
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [9] => Array
        (
            [vid_id] => 419843
            [vid_rating] => 2.95349
            [vid_quality] => 1
            [vid_special] => 0
            [vid_weight] => 3
            [vid_position] => 1
            [vid_position_end] => 2
        )

    [10] => Array
        (
            [vid_id] => 419838
            [vid_rating] => 2.73529
            [vid_quality] => 1
            [vid_special] => 0
            [vid_weight] => 4
            [vid_position] => 1
            [vid_position_end] => 2
        )

)

这个数组是这个mysql查询的结果

    SELECT 
    vid_id,
    vid_rating,
    vid_quality,
    vid_special,
    vid_weight,
    vid_position,
    vid_position_end
FROM versions
WHERE vid_movid = 'xxxxx' AND vid_status = 1 
ORDER BY vid_special DESC, vid_quality DESC, vid_rating DESC

这会输出一个网站链接列表(为简单起见,删除了实际链接列),这些链接需要按非常特定的顺序排列。使用几个 UNIONed 查询可以完成我需要做的事情......但我真的不想诉诸于此,因为成本会非常高,所以我认为操作数组会更容易。

我需要从这个数组中有选择地提取几个链接,并将它们按特定顺序粘贴到数组顶部。

  • 标有 vid_position 的链接,以及 vid_position_end 表示一个范围 该组将占用。意思是 如果有几个标记的链接 有了这些职位,只有 2 个会成为 推到顶部,如果范围是 1-2。如果它是 1-3,那么前 3 位置将被占用。

  • 权重表示其中的ORDER 链接必须排序。所以如果有 5个不同的链接,有5个不同的 位置范围为 1-2 的权重, 只会推送前 2 个权重 到顶部。剩下的3个会 留在原地。

  • 有不同的链接组。 在这种情况下,有一组 1-2, 和3-3。第一组占据 前 2 个位置,在我的示例中 有3个重量等级。另一组 占据第3位,且仅 有 1 个重量级别。

  • 顺序应该是独立的。 如果 1-2 中没有链接 组,但在 3-3 中有链接, 这意味着 3-3 个分组链接将 出现在第一位。

最佳答案

对于数组中的每个元素,在“sort_by”数组中创建一个条目,其中条目设置为您创建的排序“分数”。

分数是由您的算法生成的,用于对您的条目进行排序。请记住,您可以创建带有大量数字的乐谱。例如,最小的排序顺序乘以 10,次要的排序顺序乘以 100,接下来乘以 1000,然后将这些数字相加得到条目的分数。

然后使用Sort an Array by keys based on another Array? 通过 sort_by 数组对主数组进行排序

补充:如果计算两个原始数组元素之间的顺序很慢或代价高昂,则此方法很好,因为每个原始数组元素只进行一次评分。如果排序很容易,那么使用 uasort 可能会是更清晰的代码。

关于php - 在 php 中对这个数组进行排序的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2242438/

相关文章:

java - 如何在 Java 8 中对 List<Object> 进行排序

R 函数对列表对象中保存的 data.frames 进行排序

php - 如何从 Time Machine 或备份恢复 Homebrew 配置

php - 为什么即使在本地环境中,laravel 也会重定向到 https?

arrays - Ruby 为版本字符串提供默认数组值的优雅方式

php - 从 Paypal 支付意图多维数组中获取值

Python:ValueError:使用序列设置数组元素

php - 食品 Grocery 的日期比今天更早

php - Laravel错误: Trying to get property of non-object

java - 如何相交两个排序的整数数组而不重复?