按包含浮点值和字符串“N/A”的列对二维数组进行排序,并将“N/A”行移动到末尾

问题描述 投票:0回答:2

我的阵列:

$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 arrays sorting multidimensional-array custom-sort
2个回答
0
投票

试试这个:

<?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.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);
© www.soinside.com 2019 - 2024. All rights reserved.