PHP中的自定义数组排序

PHP中的自定义数组排序,php,arrays,sorting,Php,Arrays,Sorting,我有一个数组,看起来像: [0] => array( 23 , 890 ) [1] => array( 56 , 401 ) [2] => array( 56 , 491 ) [3] => array( 98 , 840 ) [4] => array( 56 , 821 ) [5] => array( 98 , 401 ) [6] => array( 23 , 875 ) 我想用第一个元素排序,然后用第二个元素排序,但是(这里是百万个问题)当第二个元素

我有一个数组,看起来像:

[0] => array( 23 , 890 )
[1] => array( 56 , 401 )
[2] => array( 56 , 491 )
[3] => array( 98 , 840 )
[4] => array( 56 , 821 )
[5] => array( 98 , 401 )
[6] => array( 23 , 875 )
<>我想用第一个元素排序,然后用第二个元素排序,但是(这里是百万个问题)当第二个元素在中间(x9x)中有9个数字时,我想最后排序它。像这样:

[6] => array( 23 , 875 )
[0] => array( 23 , 890 ) // !!!
[1] => array( 56 , 401 )
[4] => array( 56 , 821 ) // note that 821 is before 491, even though it is greater
[2] => array( 56 , 491 ) // !!!
[5] => array( 98 , 401 )
[3] => array( 98 , 840 )
我一直试图摆弄usort(),但没有成功。在cmp函数中比较$a和$b时,我做到了:

if( $a[0] > $b[0] )
    return 1;
elseif( $a[0] < $b[0] )
    return -1;
else
    if( $a[1][1] == 9 ) // this did not do what I wanted
        return 1;
    if( $a[1] > $b[1] )
        return 1;
    elseif( $a[1] < $b[1] )
        return -1;
    else
        return 0;
if($a[0]>$b[0])
返回1;
elseif($a[0]<$b[0])
返回-1;
其他的
if($a[1][1]==9)//这并不是我想要的
返回1;
如果($a[1]>$b[1])
返回1;
elseif($a[1]<$b[1])
返回-1;
其他的
返回0;

我真的需要一些帮助

您可以将键更改为数组中的第一个值,并按键对数组进行排序

<?php

$yourArray = array(
     array( 23 , 890),
     array( 56 , 401 ),
     array( 56 , 491 ),
     array( 98 , 840 ),
     array( 56 , 821 ),
     array( 56 , 821 ),
     array( 23 , 875 )
);

$resultArray = array();

foreach($yourArray as $_key => $_childArray) {
   $key = $_childArray[0].'.'.$_key;

   if(strpos($_childArray[1],'9')) {
       $key = $_childArray[0].'.9'.$_key;
   }

   $resultArray[$key] = $_childArray;
}

ksort($resultArray);

print_r($resultArray);

您可以将键更改为数组中的第一个值,并按键对数组排序

<?php

$yourArray = array(
     array( 23 , 890),
     array( 56 , 401 ),
     array( 56 , 491 ),
     array( 98 , 840 ),
     array( 56 , 821 ),
     array( 56 , 821 ),
     array( 23 , 875 )
);

$resultArray = array();

foreach($yourArray as $_key => $_childArray) {
   $key = $_childArray[0].'.'.$_key;

   if(strpos($_childArray[1],'9')) {
       $key = $_childArray[0].'.9'.$_key;
   }

   $resultArray[$key] = $_childArray;
}

ksort($resultArray);

print_r($resultArray);

在用于usort的函数中,使用以下命令

  if( $a[0] > $b[0] )
   return 1;
else if( $a[0] < $b[0] )
   return -1;
else if( $a[1]%10 == 9 )
    return -1;
if( $a[1] > $b[1] )
    return 1;
if( $a[1] < $b[1] )
    return -1;
else
    return 0;
if($a[0]>$b[0])
返回1;
否则如果($a[0]<$b[0])
返回-1;
否则如果($a[1]%10==9)
返回-1;
如果($a[1]>$b[1])
返回1;
如果($a[1]<$b[1])
返回-1;
其他的
返回0;

在用于usort的函数中,使用以下命令

  if( $a[0] > $b[0] )
   return 1;
else if( $a[0] < $b[0] )
   return -1;
else if( $a[1]%10 == 9 )
    return -1;
if( $a[1] > $b[1] )
    return 1;
if( $a[1] < $b[1] )
    return -1;
else
    return 0;
if($a[0]>$b[0])
返回1;
否则如果($a[0]<$b[0])
返回-1;
否则如果($a[1]%10==9)
返回-1;
如果($a[1]>$b[1])
返回1;
如果($a[1]<$b[1])
返回-1;
其他的
返回0;

这对我来说没问题,请参阅


这对我来说没问题,请参见


<代码>我不认为这在数量上考虑了<代码> 9代码/代码>当第二个元素在中间有9个(x9x)时,如何<代码> >我想最后排序。< /代码>?我不认为这在数量上考虑了<代码> 9代码>代码> >代码>当第二个元素在中间有9个数(x9x)时,我想对它排序。<代码> ValthDoIP($a(1)[1 ])< /代码>?也许这不是您所期望的,您应该显式地将
$a[1]
转换为字符串?
[1]
仅在值为字符串时有效;因此,首先将数字转换为字符串。也要考虑“代码> $b<代码>和/或两个项在中间有一个<代码> 9代码/<代码>和<代码> 0代码/> > .<代码> STARVAL($a[1)] [1 ]=9</代码>应使其工作<代码> VARYDUMP($A[1 ] [1 ])< /COD>给出字符串(1)“9”,您是否有代码> VARYDUMP($A[1)] /代码>?也许这不是您所期望的,您应该显式地将
$a[1]
转换为字符串?
[1]
仅在值为字符串时有效;因此,首先将数字转换为字符串。同时考虑“代码> $b<代码>和/或两个项在中间有一个<代码> 9代码/代码>,在这种情况下,您需要分别返回<代码> -< 1 /代码>和<代码> 0 /代码>。<代码> STARVAL($A[1)] [1 ]=9 < /代码>应使其工作<代码> VARYDUMP($A[1 ] [1 ])< /代码>给出字符串(1)“9”,不要忘记,它将变得更可读!别忘了,它会变得更可读!