我有一个简单的数组,如下所示:
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我知道,如果两个元素的primary属性都为false,则可以比较I:
function sortArray($a, $b){
if($a['primary']){
return -1;
}elseif($b['primary']){
return 1;
}else{
return $a['id'] > $b['id'];
}
}但是,为什么usort要随机化其他元素的顺序呢?是否可以使用usort()只提升元素,而保持数组的其余部分不变?
发布于 2012-07-03 09:42:09
尝试此比较函数:
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的元素移到数组的前面。
发布于 2012-07-03 09:42:44
usort()将对关键字重新编制索引。请尝试使用uasort()。
https://stackoverflow.com/questions/11303192
复制相似问题