排序关联数组-PHP
我有一个关联数组,它有字符串和数字键,如下所示排序关联数组-PHP,php,arrays,sorting,Php,Arrays,Sorting,我有一个关联数组,它有字符串和数字键,如下所示 0 => array:4 [▶] "first" => array:4 [▶] 1 => array:4 [▶] 2 => array:4 [▶] "second" => array:4 [▶] 3 => array:4 [▶] 4 => array:4 [▶] 我想对这个数组进行排序,使带有字符串键的元素首先出现,然后再出现带有数字键的
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 [▶]
我使用的是PHP7.4.7
我尝试过不同的排序机制,但都不起作用。这是否可能,以及如何实现?您可以使用自定义比较器功能根据键进行排序。在此代码中,该函数将非数字键排序在数字键之前,并且还将对每组中的键进行排序(因此第一个
位于第二个
之前):
输出:
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
)
)
感谢@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);
)
我在评论中提到的另外两个例子也在起作用
是,它正在工作,但另一个数组已按降序排序。我的意思是
uksort
首先对数字键进行排序,然后对非数字键进行排序。以前,默认情况下该数组排序正确。任何注释。这在这段代码中是不可能的,它要么适用于所有数组,要么不适用于任何数组。除非某些键是数字字符串,而不是整数?我创建了两个示例,第一个是有效的,但第二个不是。两个数组的不同之处在于,第二个数组在嵌套数组中的元素比第一个数组中的元素多。@FahadShaikh很抱歉没有响应。。。已经是晚上了。多亏了你的例子,我确实看到了我代码中的打字错误($ka
,我本应该在那里输入$kb
)。我已经改正了。我看你自己也在这段时间内解决了,所以+1。
<?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);
[second] => Array
(
[0] => second
)
[0] => Array
(
[0] => 0
)
[1] => Array
(
[0] => 1
)
[2] => Array
(
[0] => 2
)
[3] => Array
(
[0] => 3
)
[4] => Array
(
[0] => 4
)