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
        }

これは、実際のP​​HPコードではなく、どのように見えるかを示すためのものです。

さて、私がやりたいのはこれです-配列との合計で配列を並べ替えたいと思い$foo1ます。しかし、これは私の最後の質問と同じではありません。今回は、配列の値が100未満であるか、配列の値が600未満である場合、上部の近くに配置したくありません。配列の値が100を超え、配列の値が600を超える最後のすべての配列の後ろに配置する必要があります。したがって、次の配列の場合、結果は次のようになります。$foo2$foo3$foo2$foo3$foo2$foo3

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

上記を完全に理解していない場合は、これが理由です。これは、配列$foo2と同じキーを持つ配列の値が100を超えており、配列foo1と同じキーを持つ配列の値が600を超えており、合計が最も高いためです。これは、要件を満たす同じインデックスキーを持ち、合計が最も高い次の要素であるため、次の要素です。次は、他のどの行も要件を満たしていないためです。また、他の配列のの同等のキーは、要件を満たしていない行の中で最大の合計を持っています。同じ理由で4位と5位です。$foo1$foo3foo1$foo1foo2foo4foo4foo3foo5

私があまり具体的ではないことを願っています、そして何か助けはありますか?

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 に答える