按值对多维数组进行排序非常简单,已在此处多次回答
usort($myArray, function($a, $b) {
return $a['field'] - $b['field'];
});
我现在遇到的问题是,我需要另一个条件。让我们想象一下,我有一个拥有10辆汽车和10辆摩托车的阵列。这些汽车和摩托车都是一个数组/对象,其值包含字段speed
。像
$car1 = [
'speed' => 100,
'type' => 'car'
]
$car2 = [
'speed' => 120,
'type' => 'car'
]
$car3 = [
'speed' => 180,
'type' => 'car'
]
$motorcycle1 = [
'speed' => 80,
'type' => 'motorcycle'
]
这些都存储在一个数组中
$vechicles = [$car1, $car2, $car3, $motorcycle1]
我现在想做的是按速度排序。就像我说的那样,这很容易
usort($myArray, function($a, $b) {
return $a['speed'] - $b['speed'];
});
我现在面临的问题是,与速度值无关,至少每三辆车必须是一辆摩托车。可能是,第一个条目是摩托车,并不重要,但它不是所有汽车。它必须至少是一辆摩托车。如果它是1,2或3辆摩托车,这里无所谓。 所以最后看起来应该是这样的
$finalArray = [$car3, $car2, $motorcycle1, $car1];
正如您所看到的,虽然$car1
比$motorcycle1
快,但摩托车更早出现。
问题是,当我有两个不同的数组时
$cars = [$car1, $car2, $car3]
和
$motorcycles = [$motorcycle1]
我可以简单地将其拼接,比如
array_splice($cars, 2, 0, $motorcycles[0]);
但后来我遇到了一个问题,我无法按速度对其进行排序。有没有办法实现这个目标?
答案 0 :(得分:1)
嗯,最简单的解决方案
$vehicles = [...]; // sorted by speed already
$count = count($vehicles);
$temp = 0;
foreach($vehicles as $key => $veh){
if(is_car($veh)){
$temp++;
}else{
$temp = 0;
}
if($temp == 3){
for($i = $key + 1; $i<=$count; $i++){
if(is_motorcycle($vehicles[$i])){
array_splice($vehicles, $key, 0, $vehicles[$i]);
break;
}
}
$temp = 0;
}
}
显然这不是工作代码,我只是写它来说明我的想法,如果你认为你可以从中受益,快乐的调整! :P