php - 使用特殊键对数组中的数据进行排序

标签 php arrays sorting

如果键不仅仅是字符串(乍一看),但包含由字符“_”分隔的数字,如何对数组中的数据进行排序

例如:

id_1_2_-1.25_0
id_1_2_-0.25_0
id_1_2_1.75_0
id_1_2_3_0
id_1_2_-4_0
id_1_2_0_0

ksort() 不能用,因为-1.25 之类的值前的“负号”不被识别为负数,而是特殊符号

重要!!我不能只分隔一个数字(-1.25、-0.25、1.75、3、-4、0),其他数字也可能不同,例如 id_9_4_-2.25_1 并且数组按所有数字排序字符“_”fe首先是 9,然后是 4,然后是 -2.25,最后一个是 1

我需要结果(排序键):

id_1_2_-4_0
id_1_2_-1.25_0
id_1_2_-0.25_0
id_1_2_0_0
id_1_2_1.75_0
id_1_2_3_0

最佳答案

宇宙飞船运算符(operator)可以毫无困难地对数组进行排序。每次只需炸开 key 即可。

代码:(Demo)

$indexes = [
    'id_1_2_3_0' => 1,
    'id_1_2_-0.25_0' => 2,
    'id_1_2_1.75_0' => 3,
    'id_1_2_-4_0' => 4,
    'id_1_2_0_0' => 5,
    'id_1_2_-1.25_0' => 6,
];

uksort($indexes, function($a, $b) {
    return explode('_', $a) <=> explode('_', $b);
});

var_export($indexes);

从 PHP7.4 开始,您可以使用更简洁的箭头函数语法。 ( Demo )

uksort($indexes, fn($a, $b) => explode('_', $a) <=> explode('_', $b));

附注如果您真的想激怒您的代码的 future 读者,您可以分解每个键,转置(将其旋转 90 度)生成的列数据,然后调用 array_multisort()。 ( Demo )

[$c1, $c2, $c3, $c4, $c5] = array_map(null, ...array_map(fn($k) => explode('_', $k), array_keys($indexes)));
array_multisort($c1, $c2, $c3, $c4, $c5, $indexes);

关于php - 使用特殊键对数组中的数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57655328/

相关文章:

python - 如何将 numpy 数组写入 csv 文件?

string - 将后缀按后缀数组排序有何意义?

xslt - 使用 XSL 对属性进行排序

php - Laravel Notification - 在字符串上调用成员函数 routeNotificationFor()

测试 pdo 的 php 代码可用吗?

php - 数据库发布到另一个数据库

python - 如何在 numpy 中将二维数组中的行切片归零?

JavaScript 随机报价生成器

VBA 排序无法正常工作

javascript - 如何将 php 对象获取到 javascript?