PHP中的自定义数组排序

时间:2016-06-15 13:20:14

标签: 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 )

我想按第一个元素排序,然后按第二个元素排序,但是当第二个元素在中间有数字9(x9x)时,我想要排序它最后排序。像这样:

[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(http://php.net/manual/en/function.usort.php),但没有成功。当在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;

我真的可以使用一些帮助!

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

这对我有用,请参阅https://3v4l.org/jufbu

<?php
uasort($arr, function ($a, $b) {
    if( $a[0] != $b[0] )
        return $a[0] - $b[0];
    else
        if( strval($a[1])[1] == 9 )
            return 1;
        else
            return $a[1] - $b[1];
});

答案 2 :(得分:-3)

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

<?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);

查看http://sandbox.onlinephpfunctions.com/code/238ca95a59c7bc4cd6f1e23d99d3d91021825503

的时间