排序关联数组 - PHP



我有一个关联数组,其中包含字符串和数字键,如下所示

0 => array:4 [▶]
"first" => array:4 [▶]
1 => array:4 [▶]
2 => array:4 [▶]
"second" => array:4 [▶]
3 => array:4 [▶]
4 => array:4 [▶]

我想对这个数组进行排序,以便带有字符串键的元素应该首先出现,然后出现带有数字键的元素。例如

"first" => array:4 [▶]
"second" => array:4 [▶]
0 => array:4 [▶]
1 => array:4 [▶]
2 => array:4 [▶]
3 => array:4 [▶]
4 => array:4 [▶]

我正在使用 PHP 7.4.7。

我尝试了不同的排序机制,但没有任何效果。这甚至可能吗,如何?

您可以使用uksort根据具有自定义比较器功能的键进行排序。在此代码中,该函数在数字键之前对非数字键进行排序,并对每个组中的键进行排序(因此first排在second之前):

$array = array(array(0), 'first' => array('first'), array(1),array(2), 'second'=>array('second'), array(3), array(4));
uksort($array, function ($ka, $kb) {
if (is_int($ka)) {
if (!is_int($kb)) return 1;
return $ka - $kb;
}
else {
if (is_int($kb)) return -1;
return strcmp($ka, $kb);
}
});
print_r($array);

输出:

Array
(
[first] => Array
(
[0] => first
)    
[second] => Array
(
[0] => second
)    
[0] => Array
(
[0] => 0
)    
[1] => Array
(
[0] => 1
)    
[2] => Array
(
[0] => 2
)    
[3] => Array
(
[0] => 3
)    
[4] => Array
(
[0] => 4
)    
)

3v4l.org 演示

感谢@Nick让我熟悉uksort

我已经修改了uksort函数以返回所需的输出。

我已经修改了if-else条件的else部分,我检查了$ka$kb是否都是非数字的键,然后strcmp函数将评估结果。

如果$ka是非数字而$kb是数字,那么它将始终返回 false。

<?php
$array = array(array(0), 'first' => array('first'), array(1),array(2), 'second'=>array('second'), array(3), array(4));
uksort($array, function ($ka, $kb) {
if (is_int($ka)) {
if (!is_int($kb)) {
return 1;
}
return $ka - $kb;
}
else {
if (!is_int($kb)) {
return strcmp($ka, $kb);
}
return -1;
}
});
print_r($array);

输出:

数组 ( [第一个] => 数组 ( [0] => 第一个 )

[second] => Array
(
[0] => second
)
[0] => Array
(
[0] => 0
)
[1] => Array
(
[0] => 1
)
[2] => Array
(
[0] => 2
)
[3] => Array
(
[0] => 3
)
[4] => Array
(
[0] => 4
)

)

演示

我评论中提到的其他两个例子也有效

第一个例子

第二个例子

最新更新