使用usort()提升元素

时间:2012-07-03 01:00:40

标签: php arrays sorting

我有一个看起来像这样的简单数组:

array (size=6)
  0 => 
    array (size=2)
      'id' => int 1
      'primary' => boolean false
  1 => 
    array (size=2)
      'id' => int 2
      'primary' => boolean false
  2 => 
    array (size=2)
      'id' => int 3
      'primary' => boolean false
  3 => 
    array (size=2)
      'id' => int 4
      'primary' => boolean true
  4 => 
    array (size=2)
      'id' => int 5
      'primary' => boolean false
  5 => 
    array (size=2)
      'id' => int 6
      'primary' => boolean false

生成数组时,始终按id排序,如上所述。我希望做的是让usort()primaryTRUE的数组元素作为第一个元素。 primary只有一个元素TRUE

然后我编写了一个简单的比较函数,用于usort()

$data = array(
            array('id' => 1, 'primary' => FALSE),
            array('id' => 2, 'primary' => FALSE),
            array('id' => 3, 'primary' => FALSE),
            array('id' => 4, 'primary' => TRUE),
            array('id' => 5, 'primary' => FALSE),
            array('id' => 6, 'primary' => FALSE),
        );

function sortArray($a, $b){

    if($a['primary']){
        return -1;
    }elseif($b['primary']){
        return 1;
    }else{
        return 0;
    }
}

var_dump($data);

usort($data, 'sortArray');

var_dump($data);

虽然现在将带有primary = TRUE的元素提升到前面,但其余元素现在按相反的顺序排序,而id = 5的元素不合适:

array (size=6)
  0 => 
    array (size=2)
      'id' => int 4
      'primary' => boolean true
  1 => 
    array (size=2)
      'id' => int 5
      'primary' => boolean false
  2 => 
    array (size=2)
      'id' => int 6
      'primary' => boolean false
  3 => 
    array (size=2)
      'id' => int 3
      'primary' => boolean false
  4 => 
    array (size=2)
      'id' => int 2
      'primary' => boolean false
  5 => 
    array (size=2)
      'id' => int 1
      'primary' => boolean false

我知道我可以比较id,如果两个元素的primary属性都为false:

function sortArray($a, $b){

    if($a['primary']){
        return -1;
    }elseif($b['primary']){
        return 1;
    }else{
        return $a['id'] > $b['id'];
    }
}

但是,为什么usort随机化我的其他元素的顺序?是否可以使用usort()来提升元素并使数组的其余部分保持不变?

2 个答案:

答案 0 :(得分:0)

尝试此比较功能:

function sortArray($a, $b)
{
    if($a['primary'])
    {
        $result = 1;
    }
    elseif($b['primary'])
    {
        $result = -1;
    }
    else
    {
        $result = ($a['id'] < $b['id']) ? -1 : 1;
    }

    return $result;
}

您可以将$result = ($a['id'] < $b['id']) ? -1 : 1;更改为$result = ($a['id'] < $b['id']) ? 1 : -1;以按相反顺序排序。

在比较函数中,return $a['id'] > $b['id']将返回0或1(true或false),从不返回-1。来自文档:

“如果第一个参数被认为分别小于,等于或大于第二个参数,则比较函数必须返回小于,等于或大于零的整数。”

最快的比较排序是O(N * log(N)),它比线性时间慢。出于这个原因,我建议只迭代数组(O(N),线性时间)并将'primary'设置为true的元素移动到数组的前面。

答案 1 :(得分:0)

usort()将重新索引密钥。请尝试使用uasort()