0

PHP で連想配列をソートするのに助けが必要です。

並べ替えは配列キーの「名前」に依存し、キーと値のペアを保持する必要があります。次のソート順: 1) 最初の整数ASC、2) 2 番目の整数ASC、3) 3 番目の混合ASC

入力

array(6) {
  [0]=>
  array(2) {
    ["name"]=>
    string(13) "60 to 90 in 6"
    ["timing"]=>
    float(4.7)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(15) "40 to 120 in KD"
    ["timing"]=>
    float(3.3)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(14) "60 to 100 in 4"
    ["timing"]=>
    float(1.5)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(13) "60 to 90 in 4"
    ["timing"]=>
    float(2.4)
  }
  [4]=>
  array(2) {
    ["name"]=>
    string(15) "140 to 160 in 6"
    ["timing"]=>
    float(2.4)
  }
  [5]=>
  array(2) {
    ["name"]=>
    string(13) "60 to 90 in KD"
    ["timing"]=>
    float(5.7)
  }
}

出力順

1, 3, 0, 5, 2, 4

ご助力ありがとうございます。


答え:

uasort($acceleration, function($a, $b) {    
    if($a['_sort'][0] == $b['_sort'][0] AND $a['_sort'][2] == $b['_sort'][2])
    {                       
        if($a['_sort'][4] < $b['_sort'][4])
            return -1;
        elseif($a['_sort'][4] > $b['_sort'][4])
            return 1;
        else
            return 0;
    }
    elseif($a['_sort'][0] == $b['_sort'][0])
    {
        if($a['_sort'][2] < $b['_sort'][2])
            return -1;
        elseif($a['_sort'][2] > $b['_sort'][2])
            return 1;
        return 0;
    }
    else
    {
        if($a['_sort'][0] < $b['_sort'][0])
            return -1;
        elseif($a['_sort'][0] > $b['_sort'][0])
            return 1;
        else
            return 0;
    }
});

もっとエレガントな方法があると確信していますが、入力として役立つかもしれません。

4

3 に答える 3

0
<?php

$acceleration = array();
$acceleration[0]= array("name" => "60 to 90 in 6",   "timing" => 4.7 );
$acceleration[1]= array("name" => "40 to 120 in KD", "timing" => 3.3 );
$acceleration[2]= array("name" => "60 to 100 in 4",  "timing" => 1.5 );
$acceleration[3]= array("name" => "60 to 90 in 4",   "timing" => 2.4 );
$acceleration[4]= array("name" => "140 to 160 in 6", "timing" => 2.4 );
$acceleration[5]= array("name" => "60 to 90 in KD",  "timing" => 5.7 );


function comp_maker( $key ) {
    return function ($a, $b) use ( $key ) {     // closure for uasort() to use
        return strnatcmp( $a[$key], $b[$key] ); // comp by "natural order" 
    };
}

uasort($acceleration, comp_maker( 'name' ) );

// display sorted array's keys 
$str = '';
foreach ( $acceleration as $key => $value ){
    $str .= ", $key";
}
echo substr($str,1);

// output:  1, 3, 0, 5, 2, 4

ここでコードを見ることもできます

このソリューションは、配列のキーと値の関連付けを保持するため、usort() よりも適切な uasort() の適用に関する賢明なアドバイスに従います。これらを維持しないと、結果は 0,1,2,3,4,5 になり、元の配列がどのように並べ替えられたかが隠されます。

uasort() の 2 番目のパラメーターは、comp_maker() 関数を呼び出した結果としてクロージャーとして評価されることに注意してください。次に、uasort() がクロージャーを呼び出して、比較を実行できるようにします。並べ替えは strnatcmp() を使用して「人間の順序」に従って行われるため、期待どおりに値が昇順で表示されます。

結果を取得するために、array_keys() を使用することもできましたが、代わりに、key,value 構文を使用して配列を反復処理し、並べ替えられた配列のキーの新しい順序を出力することで、関数呼び出しのオーバーヘッドを回避することを選択しました。

于 2014-12-25T08:29:44.857 に答える
0

uasort()でソートした後、この配列の array_keys が必要です。比較関数(クロージャ)は書きやすいものにすべきです。

于 2013-03-28T20:47:14.803 に答える
0

ソートにユーザー定義の比較関数を使用できる usort() を使用する必要があります。そのため、neme フィールドを比較し、結果に応じて -1,0 または 1 の値を返す関数を実装する必要があります (より小さい、等しい、またはより大きい)。この関数は、正規表現を使用して名前の文字列フィールドから 3 つの値を取得し、条件を使用してそれらを比較します。

于 2013-03-28T20:48:13.277 に答える