0

这些是我的数组:

$foo1 = array (5) {
          [0] => 'foo1',
          [1] => 'foo2',
          [2] => 'foo3',
          [3] => 'foo4',
          [4] => 'foo5'
        }

$foo2 = array (5) {
          [0] => 200,
          [1] => 130,
          [2] => 110,
          [3] => 80,
          [4] => 20
        }

$foo3 = array (5) {
          [0] => 610,
          [1] => 630,
          [2] => 500,
          [3] => 800,
          [4] => 200
        }

这只是为了表示它的外观,而不是我的实际 PHP 代码。

现在,我想要做的是 - 我想按数组$foo1的总和对数组进行排序,$foo2并且$foo3. 但这和我上一个问题不一样,因为这一次,如果数组中的值$foo2小于 100 或数组中的值$foo3小于 600,我不希望它靠近顶部。我希望它放在数组$foo2中的值大于 100 且数组中的值$foo3大于 600 的所有最后一个数组的后面。因此,在以下数组的情况下,结果将是:

$foo1 = array (5) {
          [0] => 'foo1',
          [1] => 'foo2',
          [2] => 'foo4',
          [3] => 'foo3',
          [4] => 'foo5'
        }

如果您没有完全理解上述内容,这就是原因。因为与数组$foo2中key相同foo1的数组$foo1中的值在100以上,而与数组$foo3中key相同foo1的数组中的值在$foo1600以上,总和最高。foo2是下一个,因为它是具有相同索引键且满足要求并且总和最高的下一个元素。foo4下一个,因为其他行都不满足要求,并且foo4其他数组中的等效键在不满足要求的行中具有最大的总和。出于同样的原因,排名第 4 和第 5 foo3foo5

希望我不是太具体,有什么帮助吗?

4

2 回答 2

3

首先将它们组合起来,添加一个标志 ( "tail"=>true/false),然后对其进行排序。

function special_sort($arr1,$arr2,$arr3)
{
    $arr=array();
    foreach($arr1 as $key=>$val)
    {
        $arr[$key]=array("val"=>$val,"sum"=>($arr2[$key]+$arr3[$key]),"tail"=>(($arr2[$key]<100 || $arr3[$key]<600)?true:false));
    }
    usort($arr,function($a,$b){
        if($a["tail"] && !$b["tail"])
            return 1;
        elseif(!$a["tail"] && $b["tail"])
            return -1;
        elseif($a["sum"]>$b["sum"])
            return -1;
        elseif($a["sum"]<$b["sum"])
            return 1;
        else
            return 0;
    });
    return $arr;
}

测试结果:

$foo1=array("foo1","foo2","foo3","foo4","foo5");
$foo2=array(200,130,110,80,20);
$foo3=array(610,630,500,800,200);
print_r(special_sort($foo1,$foo2,$foo3));

输出

Array
(
    [0] => Array
        (
            [val] => foo1
            [sum] => 810
            [tail] => 
        )

    [1] => Array
        (
            [val] => foo2
            [sum] => 760
            [tail] => 
        )

    [2] => Array
        (
            [val] => foo4
            [sum] => 880
            [tail] => 1
        )

    [3] => Array
        (
            [val] => foo3
            [sum] => 610
            [tail] => 1
        )

    [4] => Array
        (
            [val] => foo5
            [sum] => 220
            [tail] => 1
        )

)

如果需要,您必须取出“val”值。那应该不难。

于 2012-10-15T10:05:41.863 回答
0

您可能想看看usort(),这也将使您的代码比其他示例更易于阅读。

于 2012-10-15T10:20:21.720 回答