PHP で多次元配列をソートする方法
CSVデータを多次元配列に読み込んでいます。このように、各「quot;row"」がレコードで、各「quot;column"」に同じ種類のデータが入っています。 CSVファイルを読み込むために、以下の関数を使用しています。
function f_parse_csv($file, $longest, $delimiter)
{
$mdarray = array();
$file = fopen($file, "r");
while ($line = fgetcsv($file, $longest, $delimiter))
{
array_push($mdarray, $line);
}
fclose($file);
return $mdarray;
}
行を並べ替えるために、並べ替えの列を指定できるようにする必要があります。 列の1つは、Y-m-d H:i:s
のフォーマットで日付情報を含んでおり、最新の日付が最初の行になるようにソートできるようにしたいのですが、可能でしょうか?
198
11
導入:PHP 5.3+用の非常に一般化されたソリューション。
他の回答ではできない機能を提供するため、ここに独自のソリューションを追加したいと思います。
具体的には、このソリューションの利点は次のとおりです。
1。 再利用可能です。ソート列をハードコーディングする代わりに変数として指定します。 2。 flexible です。複数の並べ替え列を指定できます(必要なだけ)-最初に等しい比較を行うアイテム間のタイブレーカーとして追加の列が使用されます。 3。 リバーシブルです。各列に対して個別に、ソートを反転するように指定できます。 4。 拡張可能です。データセットに「ダム」な方法で比較できない列が含まれている場合(例:. 日付文字列)これらのアイテムを直接比較できる値に変換する方法を指定することもできます(例:.
DateTime
インスタンス)。 5。 これは必要に応じて連想的です:このコードはアイテムの並べ替えを処理しますが、実際の並べ替え関数(usort
またはuasort
)を選択します。 6。 最後に、「array_multisort」は使用しません。「array_multisort」は便利ですが、並べ替え前にすべての入力データの投影を作成することに依存します。 これは時間とメモリを消費し、データセットが大きい場合は単に禁止される場合があります。コード。
使い方。
このセクション全体で、このサンプルデータセットをソートするリンクを提供します。
基本。
関数
make_comparer
は、目的の並べ替えを定義する可変数の引数を受け入れ、引数として使用することになっている関数をusort
またはuasort
に返します。最も簡単な使用例は、データ項目の比較に使用するキーを渡すことです。 たとえば、「名前」項目で「$ data」をソートするには、次のようにします。
実際に見てください 。
アイテムが数値で索引付けされた配列である場合、キーは数値にすることもできます。 質問の例では、これはそうです。
実際に見てください 。
複数のソート列。
make_comparer
に追加のパラメーターを渡すことにより、複数の並べ替え列を指定できます。 たとえば、「数値」で並べ替え、次にゼロインデックス列で並べ替えます。実際に見てください 。
高度な機能。
単純な文字列ではなく配列としてソート列を指定すると、より高度な機能を利用できます。 この配列は数値で索引付けする必要があり、次の項目を含める必要があります。
これらの機能をどのように使用できるか見てみましょう。
逆ソート。
名前で並べ替えするには:
実際に見てください 。
降順で番号で並べ替え、次に降順で並べ替える:
実際に見てください 。
カスタム予測。
一部のシナリオでは、値が並べ替えに適さない列で並べ替える必要がある場合があります。 サンプルデータセットの「誕生日」列はこの説明に適合します。誕生日を文字列として比較することは意味がありません(たとえば、. 「1980年1月1日」は「1970年10月10日」の前に来る)。 この場合、実際のデータを目的のセマンティクスと直接比較できる形式に投影する方法を指定します。
投影は、任意のタイプの呼び出し可能として指定できます。文字列、配列、または匿名関数として指定できます。 予測は、1つの引数を受け入れ、その予測形式を返すと想定されます。
投影は「usort」とファミリで使用されるカスタム比較関数に似ていますが、より単純であり(ある値を別の値に変換するだけで済みます)、すでに「make_comparer」に焼き付けられているすべての機能を利用することに注意してください。
投影なしでデータセットの例をソートして、何が起こるか見てみましょう。
実際に見てください 。
それは望ましい結果ではありませんでした。 ただし、
date_create
を投影として使用できます。実際に見てください 。
これは私たちが欲しかった正しい順序です。
予測が達成できることは他にもたくさんあります。 たとえば、大文字と小文字を区別しない並べ替えをすばやく取得する方法は、「strtolower」を投影として使用することです。
そうは言っても。, それと#39についても触れておきます。;データセットが大きい場合は予測を使用しない方がよいでしょう。その場合、すべてのデータを事前に手動で投影し、投影を使用せずに並べ替える方がはるかに高速になります。, そうすることで、メモリ使用量の増加がより速いソート速度と交換されます。
最後に、すべての機能を使用する例を次に示します。最初に数値降順で並べ替え、次に誕生日昇順で並べ替えます。
実際に見てください 。
array_multisort()を使用できます。
このようなものを試してください:
PHPの場合> = 5.5.0は、列を抽出して並べ替えするだけです。 ループの必要はありません:
usort](http://docs.php.net/manual/en/function.usort.php)を使って。以下は、異なるカラムに使用できる一般的な解決策です。
最初のカラムでソートする。
クロージャを使用した複数行の並べ替え。 -------------------------------------------------- -。
uasort()と匿名のコールバック関数(クロージャー)を使用した別のアプローチを次に示します。 私はその機能を定期的に使用しました。 PHP 5.3が必要 –依存関係がなくなりました。!
この質問が尋ねられて回答されてから2年になることは知っていますが、2次元配列をソートする別の関数を次に示します。 可変数の引数を受け入れ、複数のキー(列名など)を渡して並べ替えることができます。 PHP 5.3が必要です。
http://qaify.com/sort-an-array-of-associative-arrays-by-value-of-given-key-in-php/。
Usort"関数は、あなたの答えです。
http://php.net/usort
以下は、1つ以上のフィールドをソートするphp4 / php5クラスです。
TableSorterクラスを実行する前に、Shinhanが提供したものに基づいた機能を考え出しました。
私はいくつかの人気のあるarray_multisort()とusort()の回答を試しましたが、どれもうまくいきませんでした。 データがごちゃごちゃになり、コードが読み取れなくなります。 これが簡単な汚れた解決策です。 警告:不正な区切り文字が後であなたを悩ませるために戻ってこないことが確実な場合にのみ、これを使用してください。!
マルチアレイの各行が次のようになるとします:名前、stuff1、stuff2:
アルファベット順に返送してください?
うん、汚い。 しかし、非常に簡単です、あなたの頭を爆発させません。
array_multisort を使うのが良いですね。ドキュメントを参照してください こちらを参照してください。