この質問は、PHP における配列の並べ替えの問題に関する参照を目的としています。あなたの特定のケースはユニークであり、新しい質問に値すると考えるのは簡単ですが、実際には、ほとんどはこのページの解決策の 1 つを少し変更したものにすぎません。
あなたの質問がこの質問の重複としてクローズされた場合は、その質問が以下のすべての質問と大きく異なる理由を説明できる場合にのみ、質問の再開を依頼してください。
PHP で配列をソートするにはどうすればよいですか?
PHP で complex 配列をソートするにはどうすればよいですか?
PHPでオブジェクトの配列をソートするにはどうすればよいですか?
基本的な 1 次元配列が含まれています。多次元配列、オブジェクトの配列。含まれます。ある配列を別の配列に基づいて並べ替える
SPL ソートを使用する
安定したソート
PHP の既存の関数を使用した実際的な答えについては 1 を参照してください。ソート アルゴリズム (PHP 関数が実装しており、非常に複雑な状況で 必要になる可能性があります) に関する学術的な詳細な答えについては 2 を参照してください。
P粉4764755512023-10-18 13:03:18
わかりました、deceze では基本的なメソッドのほとんどがカバーされています。他のタイプの並べ替えについても見ていきます
SplHeap
SplMaxHeap クラスは、最大値を先頭に維持するヒープの主要な機能を提供します。
リーリー
その他の種類の並べ替えP粉9523651432023-10-18 09:01:08
適用可能な並べ替え関数:
ナットソート
natcasesort
ksort
krsort
それらの唯一の違いは、キーと値の関連付けを保持するかどうか (「
a」) です。 >" )、値またはキーをソートするかどうか ("
k" と通常)。
http を参照してください。 ://php.net /manual/en/array.sorting.phpオブジェクト配列を含む多次元配列
リーリー
を並べ替える場合は、 カスタム比較関数
が必要になります。上記の sort
および関連関数は、比較と並べ替えの方法がわかっている単純な値に対して適切に機能します。 PHP は、array('foo' => 'bar', 'baz' => 42); のような 複雑な値
をどう処理するかを単に「知っている」わけではないので、それを伝える必要があります。
これを行うには、 比較関数 を作成する必要があります。この関数は 2 つの要素を受け入れ、要素が等しいとみなされる場合は
より小さい値を返す必要があります。最初の値が等しいとみなされる場合は 0
より小さい値を返す必要があります。等しい 0 より小さい値は、最初の値の方が大きい場合、0 より大きい値を返さなければなりません。これが必要なものです:
リーリー
通常、コールバックとして 匿名関数
PHP でコールバックを指定するその他の方法を参照してください。
これで、次のいずれかの関数を使用できるようになります:
usort
リーリー
usortcmp()
は、array('foo' => 'bar', 'baz' => 42)$a
の形式で呼び出します。 $bを別の
array('foo' => ..., 'baz' => ...) として使用します。次に、関数は usort
どちらの値が大きいか、またはそれらが等しいかどうかを返します。 usort
配列がソートされるまで、$a
と $b
に異なる値を渡して、このプロセスを繰り返します。 cmp
関数は複数回呼び出されます。 少なくとも
$array にある値と同じ数、および
値のさまざまな組み合わせが呼び出されます。各タイムコードは >$a および
$b です。
このアイデアに慣れるには、次のことを試してください:
リーリー
必要なのは、2 つの項目を比較するカスタム方法を定義することだけです。これはさまざまな値に適用できます。
ところで、これは任意の値で機能します。複雑な配列である必要はありません。カスタム比較を行う場合は、単純な数値配列を比較することもできます。
sort
参照による並べ替えでは、有用なものは何も返されません。 配列 はインプレースでソートされるので、戻り値を何かに割り当てる必要がないことに注意してください。 $array = sort($array) は、並べ替えられた配列ではなく、配列を
true に置き換えます。
sort($array); だけです。
baz で並べ替える場合、必要なのは次のとおりです:
リーリー
のおかげで、$a が < 0、0 或 >$b# より小さいか、等しいか、大きいかに応じて、値 0 が返されます。 ##.
これは、
float
int に単純化され、精度が失われます。代わりに、明示的な
-1、
0、および
1 戻り値を使用してください。
###物体###
オブジェクトの配列がある場合も、同じように動作します。
リーリー
###関数###
リーリー
cmp
で予期されることを正確に実行し、0
、または 1## を返します。 #.
宇宙船オペレーター
PHP 7 では、spaceship 演算子
が導入され、タイプ間での等しい/より小さい/より大きい比較を統合および簡素化します。
リーリー
複数のフィールドで並べ替える
主に
foo
baz でソートします。 リーリー 詳しい方のために説明すると、これは p>ORDER BY foo, baz
この非常に簡潔な短縮版 および
任意の数のキーに対してこのような比較関数を動的に作成する方法 も参照してください。
手動の静的順序で並べ替えます
"foo"、"bar"、"baz" :
リーリー
上記のすべてと同様、PHP 5.3 以降を使用している場合 (実際にそうすべきです)、匿名関数を使用してコードを短縮し、別のグローバル関数を避けてください。
リーリー
これは、複雑な多次元配列を並べ替える簡単な方法です。繰り返しになりますが、2 つの項目のうちどちらが「大きい」かを判断する方法を PHP に教えます; PHP に実際の並べ替えを実行させます。
パラメータと $b パラメータを交換するだけです。例えば:### リーリー
別の配列に基づいて配列を並べ替える独特の
array_multisort もあり、これを使用すると、次の条件に基づいて配列を並べ替えることができます。 別の要素:
リーリーここで期待される結果は次のとおりです:
リーリー
array_multisort
を使用してそこに到達します:
を使用して多次元配列から列を抽出し、その列で配列を並べ替えることができます。
リーリー
複数の列をどちらかの方向に並べ替えることもできます:
リーリー
PHP 7.0.0 以降では、オブジェクトの配列からプロパティを抽出することもできます。