【问题标题】:Can I sort an array in php using usort on basis of value我可以根据值使用 usort 对 php 中的数组进行排序吗
【发布时间】:2013-06-13 07:50:25
【问题描述】:

我想根据最终分数对这个数组进行排序,并保留我的键。我可以使用 usort 吗?怎么样?

Array
(
[2253472] => Array
    (
        [noOfDays] => 1
        [bestAns] => 1
        [finalScore] => 13.5
    )

[2253465] => Array
    (
        [noOfDays] => 1
        [bestAns] => 0
        [finalScore] => 50
    )

[2253473] => Array
    (
        [noOfDays] => 1
        [bestAns] => 0
        [finalScore] => 23
    )

[2253471] => Array
    (
        [noOfDays] => 1
        [bestAns] => 0
        [finalScore] => 89
    )

[2253464] => Array
    (
        [noOfDays] => 1
        [bestAns] => 1
        [finalScore] => 0.5
    )

[2253415] => Array
    (
        [noOfDays] => 6
        [bestAns] => 0
        [finalScore] => 0.333
    )
)

【问题讨论】:

  • 是的,您可以使用usort .. 到目前为止您能向我们展示您的代码吗...

标签: php


【解决方案1】:

你只需要

// Ascending
usort($data, function ($a, $b) {
    return $a['finalScore'] - $b['finalScore'];
});

// Descending
usort($data, function ($a, $b) {
    return $b['finalScore'] - $a['finalScore'];
});

【讨论】:

    【解决方案2】:

    是的,如果不保留键,你可以,你只需要一个用户定义的比较方法。

    使用uasort() 保存密钥:http://www.php.net/manual/en/function.uasort.php

    示例:

    function cmp($a, $b)
    {
        if ($a == $b) {
            return 0;
        }
        return ($a < $b) ? -1 : 1;
    }
    
    $a = array(3, 2, 5, 6, 1);
    
    uasort($a, "cmp");
    

    对于你的数组,有一些解释

    uasort($array, "cmp");
    
    function cmp($a,$b){
       if ($a['finalScore'] == $b['finalScore'])
        {
            // Same score, keep same
            return 0;
        }
        elseif ($a['finalScore'] > $b['finalScore'])
        {
            // $a has higher score, move $b down array
            return -1;
        }
        else {
            // $a has lower score, move $b up array             
            return 1;
        }
    }
    

    -1 向下移动,0 离开,1 向上推

    【讨论】:

    • 这不维护数组的键。新数组的索引按递增顺序 0 ,1, ... 如何保留键?
    • 数组 ( [0] => 数组 ( [noOfDays] => 1 [bestAns] => 1 [finalScore] => 13.5 ) [1] => 数组 ( [noOfDays] => 1 [ bestAns] => 0 [finalScore] => 50 ))
    • 使用 uasort() php.net/manual/en/function.uasort.php ,这是一个很好的排序差异和密钥保留表:php.net/manual/en/array.sorting.php
    • 我的分数以小数形式扩展到小数点后 3-4 位。 usort 对十进制值不起作用吗?
    • 哇,你接受了这个答案,它只是粘贴了一点代码,没有任何解释,所以你什么都学不到......呃..我为什么还要尝试。
    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2023-03-31
    • 2011-01-18
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多