ale*_*xso 4 php arrays sorting
如果键不只是字符串(乍一看),而是包含由字符“ _”分隔的数字,则如何对数组中的数据进行排序
fe:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
太空飞船的运营商没有排序数组的麻烦。每次都爆炸钥匙。
代码:(演示)
$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);
Run Code Online (Sandbox Code Playgroud)
从PHP7.4开始,您可以使用更简洁的箭头函数语法。(演示)
uksort($indexes, fn($a, $b) => explode('_', $a) <=> explode('_', $b));
Run Code Online (Sandbox Code Playgroud)
ps如果您真的想激怒以后的代码读者,则可以分解每个键,将生成的列数据转置(旋转90度),然后调用array_multisort()。(演示)
[$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);
Run Code Online (Sandbox Code Playgroud)