我有一个像这样的关联数组:
$返回['数据']
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&C价值显示在最后。下降时它会在开始时显示出来。
现在我想要做的是是否应该根据得分值相应地对数组的升序或降序进行排序,但是当得分值为&n; a / 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);
}
我希望我的问题很明确,如果有人可以提供简单有效的解决方案。
编辑: - 我想这样做 - 检查数组中得分的值是否为“不适用”。从他们的位置取消他们并将他们移到最后。虽然它仍然无法正常工作,但我发现错误"未设置的非法偏移类型"。我不知道我在那里做错了什么。
一旦整个数组在if else语句中排序,我就这样做了。
foreach ($return['data'] as $key) {
if($key['score'] == 'N/A'){
$item = $key;
unset($key);
array_push($return['data'], $item);
}
}
即使它工作正常,我的应用程序在某些情况下有数百条记录要在数组中排序。因此,以这种方式排序已变得非常缓慢。因此,我确定使用更多循环或类似于我尝试做的事情会让它变得更慢。这在我的情况下是不可行的。那么有没有人有更好的解决方案?
编辑:我已经改变了一些代码,它不再给我一个非法的偏移错误。但它仍然没有像我预期的那样工作。不删除所有N / A值并将它们放在最后。
答案 0 :(得分:1)
简化它:
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,否则做一般的数字比较。