Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用usort()升级元素_Php_Arrays_Sorting - Fatal编程技术网

Php 使用usort()升级元素

Php 使用usort()升级元素,php,arrays,sorting,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'

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

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()
primary
TRUE
的数组元素提升为第一个元素。始终只有一个元素的

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

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
我知道如果两个元素的
primary
属性都为false,我可以比较ID:

function sortArray($a, $b){

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

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

尝试以下比较功能:

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

    return $result;
}
函数排序($a,$b)
{
如果($a['primary']))
{
$result=1;
}
elseif($b[“主要”])
{
$result=-1;
}
其他的
{
$result=($a['id']<$b['id'])?-1:1;
}
返回$result;
}
您可以更改
$result=($a['id']<$b['id'])-1 : 1;
$result=($a['id']<$b['id'])?1 : -1;按相反顺序排序

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

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

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

将重新索引键。试着改用

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

    return $result;
}