我有数组:
$test['name1'][256]=[
'lead_data'=>[
'datum_event'=>'13.03.2019',
'address'=>'addr1'
]
];
$test['name1'][257]=[
'lead_data'=>[
'datum_event'=>'12.02.2019',
'address'=>'addr2'
]
];
$test['name2'][259]=[
'lead_data'=>[
'datum_event'=>'15.03.2019',
'address'=>'addr4'
]
];
$test['name2'][260]=[
'lead_data'=>[
'datum_event'=>'10.03.2019',
'address'=>'addr5'
]
];
$test['name2'][261]=[
'lead_data'=>[
'datum_event'=>'10.02.2019',
'address'=>'addr10'
]
];
我需要按最小的'datum_event'值对'name1'和'name2'进行排序。因此,组'name2'必须是第一个,因为存在最小的datum_event = '10 .02.2019'。 还需要按datum_event对内部数组进行排序(从最小的最远)。 我的代码是:
function getMinDate($e) {
return min(array_column(array_column($e, "lead_data"), "datum_event"));
}
uasort($test, function ($a, $b) {return strcmp(getMinDate($b), getMinDate($a));});
foreach($test as &$e) {
uasort($e, function ($a, $b) {
return strcmp($a['lead_data']['datum_event'], $b['lead_data']['datum_event']);});
}
由于无法获得正确的输出,组'name2'是第二个,但必须是第一个。 拜托,我该怎么解决?
答案 0 :(得分:0)
您的日期是不是可排序格式的字符串,因此您需要先将所有字符串转换为可排序形式,然后排序才能起作用。 d.m.Y
不能正确排序,但是如果将它们转换为Y-m-d
格式或时间戳,它将起作用。
我认为在排序之前先执行一次此操作会比在比较功能内重复执行更为有效。
因此,请对name*
数组进行预处理以确定最短日期。
foreach ($test as $name => $leads) {
$test[$name]['min_date'] = min(array_map(function($lead){
return date_create($lead['lead_data']['datum_event'])->format('U');
}, $leads));
}
然后按该新键排序。
uasort($test, function($a, $b) {
return $a['min_date'] <=> $b['min_date'];
});
如果需要,可以在排序后删除排序键。
foreach ($test as $name => $leads) {
unset($test[$name]['min_date']);
}