1

この多次元配列を並べ替える方法を見つけるのにとてもうんざりしています。試しusort()ましたが、思い通りに並べ替えられません。あるいは、使用する正しいロジックを理解できなかったのかもしれません。usort()私には理解しにくいようです。

各サブ配列の値が高い方(キーaとbの間)を最初に見つけることで、データを並べ替えたいと思いました(以下の例) 。そして、キーaまたはbのいずれかから最も高い値を持つサブ配列が一番上になります。

たとえば、この配列:

Array
(
    [0] => Array
        (

         [a]=>5
         [b]=>
         [c]=>apple

        )

    [1] => Array
        (

         [a]=>5
         [b]=>7
         [c]=>guava

        )

    [2] => Array
        (

         [a]=>6
         [b]=>
         [c]=>banana

        )
    [3] => Array
        (

         [a]=>5
         [b]=>
         [c]=>avocado

        )

)

次のように並べ替える必要があります。

Array
(
    [0] => Array
        (

         [a]=>5
         [b]=>7
         [c]=>guava

        )

    [1] => Array
        (

         [a]=>6
         [b]=>
         [c]=>banana

        )

    [2] => Array
        (

         [a]=>5
         [b]=>
         [c]=>apple

        )
    [3] => Array
        (

         [a]=>5
         [b]=>
         [c]=>avocado

        ) 

それで、私はこれをどのように正確に行うことができますか?usortの使い方がとても混乱しています。これをソートするための最良のPHP関数は何ですか?

4

3 に答える 3

3

動作する方法usort()は、配列の要素を相互に比較して、何が最初に来るかを決定する方法が必要なことです。これに関数を指定すると、入力配列の要素ペアごとにその関数が呼び出されます。関数が負の値を返す場合は、最初の引数が2番目の引数よりも小さく、ソートされた配列でその前に来る必要があることを意味します。正の値を返す場合は、逆になります。

s12つのサブ配列とを比較しているとしましょうs2。提供したロジックを使用すると、s1は「未満」になります。s2つまり、前s1に来る必要があります。したがって、これがtrueの場合、sort関数は負の値を返す必要があります。'smaxから'smaxを引くと、適切な結果が得られるはずです。s2max(s1.a,s1.b) > max(s2.a,s2.b)s1s2

これを試して:

function sort_function(array $arr1, array $arr2) {
    $arr1_val = max($arr1['a'],$arr1['b']);
    $arr2_val = max($arr2['a'],$arr2['b']);
    return $arr2_val - $arr1_val;
}

usort($arr,sort_function);

$arrがあなたの配列であると仮定します。

于 2013-01-26T17:07:15.550 に答える
2

比較関数:

function cmp($a,$b){
    // clean up the keys so they don't cause weird cross-type comparisons
    (empty($a['a']) ? $a['a'] = 0 : NULL;
    (empty($a['b']) ? $a['b'] = 0 : NULL;
    (empty($b['a']) ? $b['a'] = 0 : NULL;
    (empty($b['b']) ? $b['b'] = 0 : NULL;

    /// figure out the pertinent value to compare
    $value_from_a_to_compare = max($a['a'],$a['b']);
    $value_from_b_to_compare = max($b['a'],$b['b']);

    if($value_from_a_to_compare ==  $value_from_b_to_compare) {
        return 0;
    }

    if($value_from_a_to_compare >  $value_from_b_to_compare) {
        return 1;
    } else {
       return -1;
    }


}

usortからこれを呼び出す

usort($your_array,'cmp');
var_dump($your_array);
于 2013-01-26T17:00:55.417 に答える
2

usortを使用できるようにするdethtron5000によって記述された関数を記述することを含む、いくつかの方法があります。

別の提案について説明します。2次配列を作成します。この配列では、最初の配列から最大の数値を入力array_multisortし、2次配列の値を使用して両方を並べ替えます。

$helper = array();
foreach ($data as $value)
{
    $helper[] = max($value['a'],$value['b']);
}
array_multisort($helper,$data);
于 2013-01-26T17:03:58.687 に答える