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;
}