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

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)

mic*_*usa 5

太空飞船的运营商没有排序数组的麻烦。每次都爆炸钥匙。

代码:(演示

$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)