首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用usort()提升元素

使用usort()提升元素
EN

Stack Overflow用户
提问于 2012-07-03 09:00:40
回答 2查看 126关注 0票数 0

我有一个简单的数组,如下所示:

代码语言:javascript
复制
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的数组元素提升为第一个元素。始终只有一个primaryTRUE的元素。

然后我编写了一个简单的比较函数来与usort()一起使用

代码语言:javascript
复制
$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的元素是错位的:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
function sortArray($a, $b){

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-03 09:42:09

尝试此比较函数:

代码语言:javascript
复制
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的元素移到数组的前面。

票数 0
EN

Stack Overflow用户

发布于 2012-07-03 09:42:44

usort()将对关键字重新编制索引。请尝试使用uasort()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11303192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档