PHP array_Multisort()関数の深い解析

5385 ワード

一、まず最も簡単な状況を見る.$arr 1=array(1,9,5);$arr2 = array(6,2,4);array_multisort($arr1,$arr2);print_r($arr1);//得られた順序は1,5,9 print_r($arr2);//得られた順序は6,4,2であり,2つの配列の値は最初から最後まで対応していると推定した:1は6,9は2,5は4に対応している.$arr 1=array(1,9,5)$arr2 = array(6,2,4);$arr3 = array(3,7,8);array_multisort($arr1,$arr2,$arr3);結果を見ると、1は最初から最後まで6に対応して3に対応し、他の項目も同様である.この対応関係はマニュアルのいわゆる「ソート時に既存のキー名関連付けを保持する」というものである.また,各配列をデータベーステーブルの列として想像することもできる.一方,対応する1,6,3は1データ行,9,2,7は別の数データ行である.のarray_Multisortは、最初の配列(列として想像)でソートされ、最初の配列(列)の値が同じ場合は、2番目の配列(列)でソートされます.具体的には、$arr 1=array(1,9,5,9);$arr2 = array(6,2,4,1);$arr3 = array(3,7,8,0);array_multisort($arr1,$arr2,$arr3);ここで$arr 3の結果は(3,8,0,7)であると想像できる.
二、次にarrayについて説明します.Multisortのパラメータ.この関数のパラメータは柔軟です.最も簡単な場合は、上記のように1つまたはn個の配列をパラメータとし、各配列の項目数が同じでなければwarningによってソートが無効になることに注意してください.こんな風にarray_multisort($arr1,$arr2,$arr3); デフォルトでは、すべての配列が昇順で並べ替えられます.$arr 2を降順し、文字列として比較するには、array_と書きます.multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);各arrayの後ろには、ソート順フラグまたはソートタイプフラグ、または2つのフラグが同時に表示されます.ただし、各ソートフラグは、各配列の後ろに1つしか表示されません.詳細は、ソート順フラグ:SORT_ASC-上昇順にソート(デフォルト)SORT_DESC-降順ソートタイプフラグ:SORT_REGULAR-プロジェクトを通常の方法で比較(デフォルト)SORT_NUMERIC-プロジェクトを数値で比較するSORT_STRING-アイテムを文字列で比較
三、最後はarray_Multisortにはどのような実用的な役割がありますか.通常、いくつかの多次元配列をソートする必要があります.
 
  
$guys = Array
(
    [0] => Array
        (
 [name] => jake
 [score] => 80
 [grade] => A
        )
    [1] => Array
        (
 [name] => jin
 [score] => 70
 [grade] => A
        )
    [2] => Array
        (
 [name] => john
 [score] => 80
 [grade] => A
        )
    [3] => Array
        (
 [name] => ben
 [score] => 20
 [grade] => B
        )
)

例えば、成績が同じなら名前の昇順に並べたいと思っています.
この場合、$guysの順序に従って2つの配列を追加する必要があります.
$scores = array(80,70,80,20);$names = array('jake','jin','john','ben');
そして
array_multisort($scores, SORT_DESC, $names, $guys);それでいい
もっと柔軟にしてもらえませんか.ソートするたびに別の配列を作らなければなりませんか.
実はqeephpのhelper_arrayクラスはすでにパッケージ化されています.次は2つの方法で、必要な人は自分で修正すれば使えます.
 
  
/**
*
*
* :
* @code php
* $rows = array(
*array('id' => 1, 'value' => '1-1', 'parent' => 1),
*array('id' => 2, 'value' => '2-1', 'parent' => 1),
*array('id' => 3, 'value' => '3-1', 'parent' => 1),
*array('id' => 4, 'value' => '4-1', 'parent' => 2),
*array('id' => 5, 'value' => '5-1', 'parent' => 2),
*array('id' => 6, 'value' => '6-1', 'parent' => 3),
* );
*
* $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC);
* dump($rows);
* // :
* // array(
* //         array('id' => 6, 'value' => '6-1', 'parent' => 3),
* //         array('id' => 5, 'value' => '5-1', 'parent' => 2),
* //         array('id' => 4, 'value' => '4-1', 'parent' => 2),
* //         array('id' => 3, 'value' => '3-1', 'parent' => 1),
* //         array('id' => 2, 'value' => '2-1', 'parent' => 1),
* //         array('id' => 1, 'value' => '1-1', 'parent' => 1),
* // )
* @endcode
*
* @param array $array
* @param string $keyname
* @param int $dir
*
* @return array
*/
          static function sortByCol($array, $keyname, $dir = SORT_ASC)
          {
   return self::sortByMultiCols($array, array($keyname => $dir));
          }
          /**
* , SQL ORDER BY
*
* :
* @code php
* $rows = Helper_Array::sortByMultiCols($rows, array(
*'parent' => SORT_ASC,
*'name' => SORT_DESC,
* ));
* @endcode
*
* @param array $rowset
* @param array $args
*
* @return array
*/
          static function sortByMultiCols($rowset, $args)
          {
   $sortArray = array();
   $sortRule = '';
   foreach ($args as $sortField => $sortDir)
   {
       foreach ($rowset as $offset => $row)
       {
$sortArray[$sortField][$offset] = $row[$sortField];
       }
       $sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
   }
   if (empty($sortArray) || empty($sortRule)) { return $rowset; }
   eval('array_multisort(' . $sortRule . '$rowset);');
   return $rowset;
          }