ホームページ >バックエンド開発 >PHPチュートリアル >PHP array_multisort() 関数の詳細な分析

PHP array_multisort() 関数の詳細な分析

高洛峰
高洛峰オリジナル
2017-01-06 16:49:541396ブラウズ

1. まず最も単純な状況を見てみましょう。 2 つの配列があります:
$arr1 = 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 に対応します。
もう 1 つの配列を追加して、何が起こるか見てみましょう:
$arr1 = 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番目の配列(列)でソートします。
具体的には、次のプログラムを使用してテストできます:
$arr1 = array(1,9,5,9);
$arr2 = array(6,2,4,1);
$arr3 = array(3, 7, 8,0);
array_multisort($arr1,$arr2,$arr3);
ここでの $arr3 の結果は (3,8,0,7) であると想像できます。

2. 次にarray_multisortのパラメータについて説明します。この関数のパラメータは非常に柔軟です。最も単純なケースは、上記のように 1 または n 個の配列をパラメーターとして使用することです。各配列内の項目の数が同じである必要があることに注意してください。そうでない場合は、警告が表示されて並べ替えが失敗します。
このように array_multisort($arr1,$arr2,$arr3); デフォルトでは、すべての配列が昇順でソートされ、$arr2 を降順でソートして文字列として比較する場合は、次のように記述する必要があります。 array_multisort($arr1, $ arr2, SORT_DESC, SORT_STRING, $arr3);
各配列の後にソート順序フラグまたはソート タイプ フラグを続けることができ、あるいは両方のフラグを同時に出現させることもできます。ただし、各配列の後に指定できるのは、各タイプのソート フラグ 1 つだけです。
詳細は次のとおりです:
ソート順序フラグ:
SORT_ASC - 昇順でソート (デフォルト)
SORT_DESC - 降順でソート
ソートタイプフラグ:
SORT_REGULAR - 通常の方法で項目を比較 (デフォルト)
SORT_NUMERIC - 項目をソート番号順に比較
SORT_STRING - 文字列に従って項目を比較します

3. 最後に、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;
          }

PHP array_multisort() 関数の詳細な分析については、お支払いください。関連記事 PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。