如果键不仅仅是字符串(乍一看),但包含由字符“_”分隔的数字,如何对数组中的数据进行排序
例如:
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/