【问题标题】:Whats the best way to sort this array in php?在 php 中对这个数组进行排序的最佳方法是什么?
【发布时间】:2010-02-11 05:15:51
【问题描述】:

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

我有以下(简化的)数组

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个重量等级。另一组 占据第三位,并且只有 有 1 个体重等级。

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

【问题讨论】:

  • 我无法理解您的订购规则。什么是组?什么是链接?
  • 每条记录都是一个网站的链接(为了简单起见,我从数组中取出了列)。

标签: php arrays sorting


【解决方案1】:

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

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

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

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

【讨论】:

  • 不确定我是否理解您的分数生成算法。你有什么例子吗?
  • @Yegor,问题是将您对如何订购原始数组的描述转换为可以比较的数值。问题是我不明白你的描述。举个例子:如果物品有一个重量,一个等级和一个质量,最不重要的排序顺序是重量*质量,更重要的是等级,所有数字都是0-9,那么得分=(重量*质量) +(评级 * 100)。这样,质量和权重得分最低的 1 评级将在质量和权重得分最高的 0 评级之前。乘数取决于可能的值
  • 质量不需要被触及。唯一起作用的因素是 vid_weight + vid_position(开始)和 vid_position_end。需要从数组中提取特殊值,然后简单地放在上面。其余项目的顺序很好。
【解决方案2】:

对于手工定制的数组排序,我会使用uasort 或其相关函数之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2021-08-28
    • 2013-07-07
    • 2011-11-27
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多