簡體   English   中英

什么是在PHP中排序這個數組的最佳方法?

[英]Whats the best way to sort this array in php?

我不能為這個問題提出任何理智的解決方案,而不訴諸自定義函數的荒謬組合。 也許你可以提供一些新的想法。

我有跟隨(簡化)數組

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,那么前三名將被占用。

  • 權重表示必須對鏈接進行排序的ORDER。 因此,如果有5個不同的鏈接,在位置范圍1-2中有5個不同的權重,則只有前2個權重將被推到頂部。 剩下的3個將保持原樣。

  • 有不同的鏈接組。 在這種情況下,有1-2組和3-3組。 第一組占據前2個位置,在我的例子中有3個重量級別。 另一組占據第3位,只有1個重量級。

  • 訂購應該是獨立的。 如果1-2組中沒有鏈接,但3-3中有鏈接,則表示3-3個分組鏈接將出現在第一個位置。

對於數組中的每個元素,在“sort_by”數組中創建一個條目,其中條目設置為您創建的排序“分數”。

分數由您的算法生成,用於訂購您的條目。 請記住,您可以創建一個包含大數字的分數。 例如,最小的排序順序乘以10,下一個最小的排序順序乘以100,然后乘以1000,然后將數字相加以獲得條目的分數。

然后使用基於另一個數組的鍵排序數組? 通過sort_by數組對主數組進行排序

補充:如果計算兩個原始數組元素之間的排序很慢或很昂貴,這種方法很好,因為每個原始數組元素只進行一次評分。 如果順序很簡單,那么使用uasort可能會更清晰。

對於手工定制的數組排序,我會使用uasort或其中一個相關函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM