按键对多维数组排序——重复项失败



我有一个函数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,但这似乎很草率,也不是很可预测,所以一个更好的行动方案将是非常感激的。

您可以简化代码,只使用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);

它们被覆盖的原因是您正在创建一个数组,其中索引是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);
输出:

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];
    });
}

相关内容

  • 没有找到相关文章

最新更新