使用 uasort 尝试对数字数组进行排序,并将任何字母值放在数组的末尾


Using uasort trying to sort a numeric array and put any alphabetical values at the end of the array

我有一个这样的关联数组:

$return["数据"]

Array (
[0] => Array
    (
        [id] => 19957
        [yt_id] => 19957-OPEN
        [name] => 19957-OPEN
        [score] => N/A
    )
[1] => Array
    (
        [id] => 19965
        [yt_id] => 19965-OPEN
        [name] => 19965-OPEN
        [score] => N/A
    )
[2] => Array
    (
        [id] => 20034
        [yt_id] => UCGbcYB89XesffWVJKPUpA
        [name] => 1994firebug
        [score] => 458.43
    )
[3] => Array
    (
        [id] => 20036
        [yt_id] => UCGbcfgXexlIirWVJKPUpA
        [name] => 1994firebug
        [score] => 344.69
    ) );

我根据分数按升序和降序对这个数组进行排序。

所以现在分数数组中的值是"N/A"。

因此,当升序排序时,最终显示具有"N/A"值的分数。当下降时,它出现在开始时。

现在我想做的是,是否应该根据分数值对数组进行升序或降序排序,但是当分数值为"n/a"时,我希望所有这些"N/A"值始终显示在数组的末尾,无论是升序还是降序。

这是我的代码。

if($sort_by == "score"){
    if($sort_direction == "asc") {
       uasort($return['data'], function($a, $b) use ($sort_by) { return strnatcmp($a[$sort_by], $b[$sort_by]);});                       
    }   else {
       uasort($return['data'], function($a, $b) use ($sort_by) { return strnatcmp($b[$sort_by], $a[$sort_by]); });                              
    }
    $return['data'] = array_slice($return['data'], $start, $length);  
}

我希望我的问题很清楚,如果有人可以帮助解决简单有效的问题。

编辑:- 我想这样做 - 检查数组中的分数值是否为"N/A",将它们从其位置取消设置并将它们移动到最后一个。虽然它仍然不起作用,但我收到错误"未设置非法偏移类型"。我不知道我在那里做错了什么。

一旦整个数组在 if else 语句中排序,我就会这样做。

    foreach ($return['data'] as $key) {
                    if($key['score'] == 'N/A'){
                    $item = $key;
                    unset($key);
                    array_push($return['data'], $item); 
                }
}

即使它有效,我的应用程序在某些情况下也有数百条记录要在数组中排序。所以这种排序方式已经变得非常缓慢。所以我确信使用更多的循环或类似我正在尝试做的事情会让它变得更慢。这在我的情况下是不可行的。那么有没有人有更好的解决方案呢?

编辑:我已经更改了代码,它不再给我非法的偏移错误。但它仍然没有像我预期的那样工作。不要删除所有N/A值并将它们放在最后。

为了简化它:

usort($data, function (array $a, array $b) {
    if ($a['score'] == $b['score']) {
        return 0;
    }
    if ($a['score'] == 'N/A') {
        return -1;
    }
    if ($b['score'] == 'N/A') {
        return 1;
    }
    return $a['score'] - $b['score'];
});

如果两个值相等("N/A"或其他任何值(,则结果为 0 ,否则如果 a 是"N/A"(另一个不是,如上一步所示(,则 a 更大,反之亦然,对于 b,否则进行一般数字比较。