按照条件对多维数组按值进行排序

3

按值对多维数组进行排序相当容易,这个问题在这里已经被多次回答过了。

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]);

但是我遇到了一个问题,就是无法按速度对其进行排序。有没有办法实现这一点?

1个回答

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

谢谢!我会试一下,然后再回来。 - Musterknabe
@Musterknabe 我认为你可能会遇到的最大问题是在迭代数组时拼接内部指针。我不确定这将如何运作。 - php_nub_qq
太棒了!可以运行。我修改了一下,像这样(现在是我的真实代码)http://pastebin.com/DN1dRZX3:) - Musterknabe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接