我的阵列:
$data = [
['id' => 1, 'value' => 1.2],
['id' => 3, 'value' => 'N/A'],
['id' => 2, 'value' => 2.5],
];
我想将具有数字
value
值的行排在具有非数字 value
值的行之前。 (2.5 -> 1.2 -> “不适用”):
我的代码:
usort($data, function($a, $b) {
if ($a['value'] == 'N/A') {
return $b['value'];
} elseif ($b['value'] == 'N/A') {
return $a['value'];
}
return strcmp($b['value'], $a['value']);
});
想要的结果:
[
['id' => 2, 'value' => 2.5],
['id' => 1, 'value' => 1.2],
['id' => 3, 'value' => 'N/A'],
]
试试这个:
<?php
$data = array(
array(
'id' => 1,
'value' => 1.2
),
array(
'id' => 2,
'value' => 2.5
),
array(
'id' => 3,
'value' => 'N/A'
)
);
$value= array();
foreach ($data as $k => $sub_arr) {
$value[$k] = $sub_arr['value'];
}
array_multisort($value, SORT_DESC, SORT_NUMERIC, $data);
print_r($data);
?>
输出:
$ php -f test.php
Array
(
[0] => Array
(
[id] => 2
[value] => 2.5
)
[1] => Array
(
[id] => 1
[value] => 1.2
)
[2] => Array
(
[id] => 3
[value] => N/A
)
)
这里我们使用array_multisort函数。
假设所有浮点值都大于
0.0
,您可以将所有值转换为浮点类型并按降序排列,而无需预先迭代输入数组来准备。
代码:(演示)
usort($data, fn($a, $b) => (float) $b['value'] <=> (float) $a['value']);
var_export($data);
如果您想在末尾显式定位
N/A
值,那么您可以提供两个值以在每次迭代时进行比较:(Demo)
usort(
$data,
fn($a, $b) => [$b['value'] !== 'N/A', $b['value']]
<=>
[$a['value'] !== 'N/A', $a['value']]
);
var_export($data);