我有一个看起来像这样的简单数组:
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
的数组元素作为第一个元素。 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()
来提升元素并使数组的其余部分保持不变?
答案 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)