在两个子阵列值上对多维数组进行排序

时间:2017-05-16 13:10:23

标签: php arrays sorting multidimensional-array

我想在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值是预计驾驶室到达的时间(以分钟为单位)。

1 个答案:

答案 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