我有一个关联数组,其中包含字符串和数字键,如下所示
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
)
)
演示
我评论中提到的其他两个例子也有效
第一个例子
第二个例子