如何基于多个条件对数组进行排序?

克雷格

我正在尝试对一个数组进行排序,该数组优先考虑最接近的宏值到最佳值,即与条件最匹配的元素的ID为200(但已排序),看起来所有“点”都prev代替了该元素。

function sorter(array $array, $optimal, $minMax){
    usort($array, function($prev, $curr) use($optimal, $minMax){
    
    $points = ['prev' => 0, 'curr' => 0];

    foreach($curr['macros'] as $macro => $value){                       
        if($value > $minMax[$macro]["minimum"] && $value <= $optimal[$macro]){
            if($macro === "protein"){
                $points['curr'] += 2;
            }
            
            if($macro === "carb" && $value < $prev["macros"][$macro]){
                $points['curr'] += 1;
            }
            
            ++$points['curr'];  
        } else {
            ++$points['prev'];
        }
    }
    
    if($points['prev'] === $points['curr']) return 0;

    return $points['prev'] < $points['curr'] ? -1 : 1;
});

return $array;
}

protein优先级更高,carbs排在第二位。

http://sandbox.onlinephpfunctions.com/code/77fc35f2fb0b60de9271f7e934a5a8a4aa3b25a3

缺口

从您的描述中,听起来好像您想按protein值与最佳值的接近程度进行排序,并通过使用最小值来打破平局carb可以通过求出abs实际protein与最佳之差,如果相等,则比较这些carb值以找到最小值来完成:

function sorter(array $array, $optimal, $minMax){
    usort($array, function ($a, $b) use ($optimal, $minMax) {
        // check closeness of protein to optimal
        $apo = abs($a['macros']['protein'] - $optimal['protein']);
        $bpo = abs($b['macros']['protein'] - $optimal['protein']);
        // if not equally close, return the closest
        if ($apo != $bpo) return $apo <=> $bpo;
        // same protein difference to optimal, return the one with least carbs
        return $a['macros']['carb'] <=> $b['macros']['carb'];
    });
    return $array;
}

对于您的样本数据,将返回:

Array
(
    [0] => Array
        (
            [id] => 200
            [macros] => Array
                (
                    [calorie] => 443.21
                    [fat] => 35.95
                    [carb] => 3.86
                    [protein] => 24.3
                )
        )
    [1] => Array
        (
            [id] => 3
            [macros] => Array
                (
                    [calorie] => 472.07
                    [fat] => 38.4
                    [carb] => 9.46
                    [protein] => 18.25
                )
        )
    [2] => Array
        (
            [id] => 19
            [macros] => Array
                (
                    [calorie] => 455.22
                    [fat] => 42.08
                    [carb] => 5.25
                    [protein] => 15.81
                )
        )
    [3] => Array
        (
            [id] => 18
            [macros] => Array
                (
                    [calorie] => 457.73
                    [fat] => 41.92
                    [carb] => 5.61
                    [protein] => 10.94
                )
        )
    [4] => Array
        (
            [id] => 9
            [macros] => Array
                (
                    [calorie] => 445.37
                    [fat] => 41.15
                    [carb] => 9.25
                    [protein] => 10.13
                )
        )
    [5] => Array
        (
            [id] => 1
            [macros] => Array
                (
                    [calorie] => 487.98
                    [fat] => 48.79
                    [carb] => 7.35
                    [protein] => 8.06
                )
        )
)

3v4l.org上的演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章