ホームページ >バックエンド開発 >PHPチュートリアル >日付やカスタム基準を含む列ごとに多次元 PHP 配列を効率的に並べ替える方法

日付やカスタム基準を含む列ごとに多次元 PHP 配列を効率的に並べ替える方法

Susan Sarandon
Susan Sarandonオリジナル
2024-12-20 16:34:09798ブラウズ

How to Efficiently Sort a Multidimensional PHP Array by Column, Including Dates and Custom Criteria?

PHP での多次元配列の並べ替え: 柔軟なアプローチ

クエリ

指定された列に基づいて多次元配列を効率的に配置するにはどうすればよいですか。特にデータに日付が含まれており、並べ替え基準をカスタマイズしたい場合は?

回答

PHP 5.3 の拡張ソリューションの紹介

このソリューションにはいくつかの利点があります。

  • 再利用可能: 定義ソート列を変数。
  • 柔軟: 複数の並べ替え列と 2 番目のタイブレーカーを処理します。
  • 可逆: 各列を昇順または降順で並べ替えます。
  • 拡張可能: 複雑な場合にカスタム投影を利用します
  • 連想: 連想配列との互換性を確保するには、usort または uasort を使用します。

コード

function make_comparer() {
    // Normalize criteria
    $criteria = func_get_args();
    foreach ($criteria as $index => $criterion) {
        $criteria[$index] = is_array($criterion) ? array_pad($criterion, 3, null) : array($criterion, SORT_ASC, null);
    }

    return function ($first, $second) use (&$criteria) {
        foreach ($criteria as $criterion) {
            // Comparison details
            list($column, $sortOrder, $projection) = $criterion;
            $sortOrder = $sortOrder === SORT_DESC ? -1 : 1;

            // Project and compare values
            $lhs = $projection ? call_user_func($projection, $first[$column]) : $first[$column];
            $rhs = $projection ? call_user_func($projection, $second[$column]) : $second[$column];

            // Determine the comparison result
            if ($lhs < $rhs) {
                return -1 * $sortOrder;
            } elseif ($lhs > $rhs) {
                return 1 * $sortOrder;
            }
        }

        // Tiebreakers exhausted
        return 0;
    };
}

使い方

サンプルを検討するデータ:

$data = array(
    array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),
    array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '01/12/1979'),
    array('aa', 'name' => 'Paul', 'number' => 16, 'birthday' => '03/11/1987'),
    array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'),
);

基本的な並べ替え:

  • 「名前」列による並べ替え: usort($data, make_comparer('name'));

複数のソート列:

  • 「number」列で並べ替え、次にゼロインデックスの列で並べ替えます: usort($data, make_comparer('number', 0));

上級機能:

  • 逆ソート: 「name」列の降順でソート: usort($data, make_comparer(['name', SORT_DESC]));
  • カスタム投影: 誕生日の日付をタイムスタンプに投影します並べ替えの場合: usort($data, make_comparer(['birthday', SORT_ASC, 'date_create']));

複雑な使用例:

  • 「数字」列の降順で並べ替え、その後に予想される「誕生日」が続きます列の昇順:

    usort($data, make_comparer(
      ['number', SORT_DESC],
      ['birthday', SORT_ASC, 'date_create']
    ));

以上が日付やカスタム基準を含む列ごとに多次元 PHP 配列を効率的に並べ替える方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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