我想在eta
ASC然后ab
ASC上对数组进行排序。
这是输入数组:
$res_ubr=array(
"0"=>array(
"ab"=>"jdfd",
"bb"=>"iweuiru",
"eta"=>4
),
"1"=>array(
"ab"=>"dsdjdfd",
"bb"=>"iuiru",
"eta"=>5
),
"2"=>array(
"ab"=>"jdgfd",
"bb"=>"edfguiru",
"eta"=>2
),
"3"=>array(
"ab"=>"err",
"bb"=>"iuierru",
"eta"=>2
),
"4"=>array(
"ab"=>"fdfdf",
"bb"=>"dfdf",
"eta"=>3
)
);
这是我的预期结果:
[
['ab'=>'err', 'bb'=>'iuierru', 'eta'=>2],
['ab'=>'jdgfd', 'bb'=>'edfguiru', 'eta'=>2],
['ab'=>'fdfdf', 'bb'=>'dfdf', 'eta'=>3],
['ab'=>'jdfd', 'bb'=>'iweuiru', 'eta'=>4],
['ab'=>'dsdjdfd', 'bb'=>'iuiru', 'eta'=>5]
]
这是我尝试过的:
$res2=$res_ubr;
$temp=array();
foreach($res_ubr as $key=>$val){
foreach($res2 as $k=>$v){
if($val['eta']>$v['eta']){
$temp[]=$res_ubr[$key];
$res_ubr[$key] =$res_ubr[$k];
$res_ubr[$k]=$temp[];
}
}
}
print_r($res_ubr);
对于上下文,eta值是预计驾驶室到达的时间(以分钟为单位)。
答案 0 :(得分:0)
您只需要分配一个唯一的临时密钥。输入数组中有两个值为2
的eta,因此您需要提供“tie breaker”。当存在两个重复的ab
时,我使用eta
值来指示排序顺序。我随意将eta
值填充为8位数,以确保按预期进行数字排序。如果没有左边填充零,10
将出现在2
之前,因为临时密钥将按字符串排序(从左到右一次一个字符),1
在{{1}之前}}
2
因为你说eta是出租车到达时间,我敢打赌你的公司没有eta会在数千万分钟内完成,所以你可以将填充量从foreach($res_ubr as $sub){
$result[str_pad($sub["eta"],8,'0',STR_PAD_LEFT).$sub["ab"]]=$sub;
}
ksort($result);
var_export(array_values($result));
减少到什么永远是合理的预期。
请记住,如果有一个重复的临时密钥(一对匹配的eta& ab),那么我的方法将用第二个元素覆盖第一个元素,你将丢失数据。如果这是一种远程可能性,您还应该将8
附加到临时密钥。如果再次出现重复风险,则应添加随机生成的数字字符串,以防止数据被删除。
使用eta ASC输出,ab ASC:
bb