php多维数组按键排序(有例外)

php多维数组按键排序(有例外),php,arrays,sorting,multidimensional-array,Php,Arrays,Sorting,Multidimensional Array,我正在尝试按多维数组的键对其进行排序,但排序中有例外。我知道我可以使用数组\多端口数组\列。。。按多列排序,但我的问题是,我的排序更多的是按类型,而不是按字母数字或数字 我正在使用的多维数组示例如下: [ 0 ['woid'=>17642-1,'schedule'=>'URGENT'] 1 ['woid'=>17643-1,'schedule'=>'ASAP'] 2 ['woid'=>17643-2,'schedule'=>'ASAP'] 3 ['wo

我正在尝试按多维数组的键对其进行排序,但排序中有例外。我知道我可以使用数组\多端口数组\列。。。按多列排序,但我的问题是,我的排序更多的是按类型,而不是按字母数字或数字

我正在使用的多维数组示例如下:

[
 0 ['woid'=>17642-1,'schedule'=>'URGENT']
 1 ['woid'=>17643-1,'schedule'=>'ASAP']
 2 ['woid'=>17643-2,'schedule'=>'ASAP']
 3 ['woid'=>17644-1,'schedule'=>'JAN']
 4 ['woid'=>NC323-1,'schedule'=>'URGENT']
 5 ['woid'=>NC324-1,'schedule'=>'ASAP']
]
我想要的是按key=woid排序,从顶部排序的ASC的“NC”开始,然后按key=schedule按以下顺序排序剩余的ASC:

URGENT
JAN
FEB
MAR
APR
MAY
JUN
JUL
AUG
SEP
OCT
NOV
DEC
ASAP
同时在key=woid上保留ASC排序

我理解这可能令人困惑。下面是上述阵列示例的预期结果示例:

[
 0 ['woid'=>NC323-1,'schedule'=>'URGENT']
 1 ['woid'=>NC324-1,'schedule'=>'ASAP']
 2 ['woid'=>17642-1,'schedule'=>'URGENT']
 3 ['woid'=>17644-1,'schedule'=>'JAN']
 4 ['woid'=>17643-1,'schedule'=>'ASAP']
 5 ['woid'=>17643-2,'schedule'=>'ASAP']
]
如果需要更多的信息或更大的示例,我非常乐意花时间提供这些信息。

您需要使用usort来满足这样的多个排序条件

对于usort比较函数,在确定每个woid是否以“NC”开头后,可以从数学上比较该检查的结果,然后使用自定义排序数组中的顺序,最后使用strcmp打破关系

$order = ['URGENT','JAN','FEB','MAR','APR','MAY','JUN',
          'JUL','AUG','SEP','OCT','NOV','DEC','ASAP'];

$order = array_flip($order);

usort($array, function($a, $b)  use ($order) {
    $aNC = strpos($a['woid'], 'NC') === 0;
    $bNC = strpos($b['woid'], 'NC') === 0;
    return ($bNC - $aNC)
        ?: ($order[$a['schedule']] - $order[$b['schedule']])
        ?: strcmp($a['woid'], $b['woid']);
});
在第一次比较中,$aNC和$bNC将是布尔值,但将转换为整数0或1进行减法运算。如果该比较返回0,表示woid值均以“NC”开头,或两者均以“NC”开头,则将对第二次比较进行评估

在第二次比较中,将减去$order数组中两个计划值的位置。如果该比较返回0,表示两个计划值相同,则将对第三个比较进行评估

在第三次比较中,strcmp用于根据两个woid值的字符串比较返回0


我甚至不知道从哪里开始处理异常,我也不知道如何将ASC排序放在表示NC1、NC2、NC3、1、2、3的ASC排序之上。我只熟悉传统排序,它将为ASC生成1、2、3、NC1、NC2、NC3,为DESC生成NC3、NC2、NC1、3、2、1。对于所有编辑,我深表歉意。我不断地重读这个问题,并注意到我错过的其他标准。不用担心,我很欣赏快速的回答。我得到了一个奇怪的回报。返回的数组正在按计划键排序,但似乎忽略了woid键。NC和17似乎在整个过程中混合在一起,而不是NC在顶部,其他所有内容都按ASC woid按计划排序。usort对我来说是新事物,因此我仍在尝试消化您发送给我的内容以尝试其他事物。@CraigHowell我添加了更多关于排序标准的解释,并添加了一个指向工作演示的链接。该链接肯定按预期工作,并返回了所需的结果。我将不得不在我这方面进一步深入研究,以找出为什么它在我的生产中不起作用。解决了问题,它就在我这方面。所有设置和工作完全符合预期。谢谢你花时间帮助我,教我一些新东西!