0

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

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()元素成为第一个元素。总是只有一个元素是。primaryTRUEprimaryTRUE

然后我写了一个简单的比较函数来使用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);

虽然元素 withprimary = TRUE现在被提升到前面,但其余元素现在以相反的顺序排序,并且元素 withid = 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()仅提升元素而保持数组的其余部分不变?

4

2 回答 2

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(真或假),从不返回 -1。从文档中:

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

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

于 2012-07-03T01:42:09.070 回答
0

usort()将重新索引键。尝试使用uasort()代替。

于 2012-07-03T01:42:43.853 回答