按键对多维数组进行排序 - 重复时失败

时间:2015-07-22 17:08:11

标签: php arrays sorting multidimensional-array

我有一个函数sortBy(),我用它来按特定键对多维数组进行排序。这是一个示例数组:

Array
(
[0] => Array
    (
        [id] => 4
        [type] => 1
        [game] => 1
        [platform] => 0
        [TotalPot] => 7550
    )

[1] => Array
    (
        [id] => 5
        [type] => 0
        [game] => 2
        [platform] => 0
        [TotalPot] => 7500
    )

)

这是函数

function sortBy($arr, $field='id', $order=1) {
    $a = array();
    if ( !is_array($arr) )
        return false;
    foreach($arr as $subArr) {
        $a[$subArr[$field]] = $subArr;
    }

    if ( $order == 1 ) sort($a);
    else rsort($a);

    return $a;
}

在这种情况下,调用sortBy($array, 'TotalPot');可以正常工作,因为TotalPot的两个值不同。但是,如果运行此示例并将两个TotalPot字段设置为$ 7500,则会用后者覆盖第一个匹配项。

使用此功能的最佳方法是什么,允许两个具有相同值的项目,但仍保持相关的顺序?我想到最后添加另一个角色A1,但这看起来很草率,而且不是很容易预测,所以我们将非常感谢更好的行动方案。

2 个答案:

答案 0 :(得分:2)

他们被覆盖的原因是因为您正在创建一个数组,其中索引是totalPot的值。

如果有重复项,那么你只有一个带有totalPot的数组元素。

最简单的方法就是用这个:

<?php

$array = [
    [
        "id" => 4,
        "type" => 1,
        "game" => 1,
        "platform" => 0,
        "TotalPot" => 7550
    ], [
        "id" => 5,
        "type" => 0,
        "game" => 2,
        "platform" => 0,
        "TotalPot" => 7500
    ]
];

usort($array, function($a, $b) {
    return $a['TotalPot'] - $b['TotalPot'];
});

print_r($array);

Output

Array
(
    [0] => Array
        (
            [id] => 5
            [type] => 0
            [game] => 2
            [platform] => 0
            [TotalPot] => 7500
        )

    [1] => Array
        (
            [id] => 4
            [type] => 1
            [game] => 1
            [platform] => 0
            [TotalPot] => 7550
        )

)

你也可以将它变成一个功能:

function sortBy($arr, $field='id', $order=1) {
    usort($arr, function($a, $b) use ($field, $order) {
        if ($order == 1)
            return $a[$field] - $b[$field];
        else
            return $b[$field] - $a[$field];
    });
}

答案 1 :(得分:2)

您可以简化代码,只需使用usort(),例如

function sortArrayByField(array &$arr, $field = "id", $ASC = TRUE) {
    usort($arr, function($a, $b)use($field, $ASC){
        if($a[$field] == $b[$field])
            return 0;
        return $a[$field] > $b[$field] ? $ASC : !$ASC;
    });
}

然后就这样称呼它:

sortArrayByField($array, "TotalPot", TRUE);
print_r($array);