三个排序规则中只有一个实际上需要自然排序。事实上,如果你使用 PHP 的 3 路比较运算符(<=>),那么它会自动将数字字符串作为数值进行比较。只有第三条规则需要显式声明自然排序,因为它需要比较字母数字字符串。
代码:(Demo)
$array = [
1 => ['Name' => 'John', 'Age' => '20', 'Code' => 'ABC 12'],
2 => ['Name' => 'John', 'Age' => '21', 'Code' => 'ABC 1'],
3 => ['Name' => 'Mary', 'Age' => '20', 'Code' => 'ABC 10'],
4 => ['Name' => 'John', 'Age' => '20', 'Code' => 'ABC 1'],
5 => ['Name' => 'John', 'Age' => '20', 'Code' => 'ABC 100'],
6 => ['Name' => 'John', 'Age' => '20', 'Code' => 'ABC 2'],
];
uasort(
$array,
fn($a, $b) =>
[$a['Name'], $b['Age']] <=> [$b['Name'], $a['Age']] // name (ASC) then by age (DESC)
?: strnatcasecmp($a['Code'], $b['Code']) // then by code (ASC / naturally)
);
var_export($array);
输出:
array (
2 =>
array (
'Name' => 'John',
'Age' => '21',
'Code' => 'ABC 1',
),
4 =>
array (
'Name' => 'John',
'Age' => '20',
'Code' => 'ABC 1',
),
6 =>
array (
'Name' => 'John',
'Age' => '20',
'Code' => 'ABC 2',
),
1 =>
array (
'Name' => 'John',
'Age' => '20',
'Code' => 'ABC 12',
),
5 =>
array (
'Name' => 'John',
'Age' => '20',
'Code' => 'ABC 100',
),
3 =>
array (
'Name' => 'Mary',
'Age' => '20',
'Code' => 'ABC 10',
),
)
请注意,由于使用了uasort(),所以输出中保留了第一级键。因为输入数组没有被索引,所以我假设键是 id 或其他重要的东西。
如果您对重新索引父级键感到满意,则可以在生成列数据数组后使用array_multisort()。 (Demo)
foreach ($array as ['Name' => $names[], 'Age' => $ages[], 'Code' => $codes[]]);
array_multisort(
$names, // ASC, REGULAR
$ages, // DESC, NUMERIC
SORT_DESC,
SORT_NUMERIC,
$codes, // ASC, NATURAL
SORT_ASC,
SORT_NATURAL,
$array // the array to be affected
);
var_export($array);