我有一个类似这样的关联数组:
$ return ['data']
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);
}
我希望我的问题很清楚,是否有人可以提供简便有效的解决方案。
编辑:-我想这样做-检查数组中score的值是否为'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更大,反之亦然,否则进行一般的数值比较。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句