排序关联数组-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
    )