ソート時にPHPのstrcmp ()関数に注意してください.
4010 ワード
私は複数のプロパティを介してオブジェクトの配列をソートする方法を探していました.いつものように、速いGoglingはスタックオーバーフローに私をナビゲートしました、そこで、私は同じquestionと最も重要なことにそれの答えを見つけました.
我々がそう示唆された解決を見てみるならば、それはusort()とstrcmp()の機能の組合せです.最初に、彼らは良いコンボのようです.負整数は、最初の引数の値が2番目の より低いことを意味しますは、等しい値を暗示します 肯定整数は、第1の引数の値が第2の より大きいことを意味します
以下に例を示します:
1桁の数字を比較すると、すべてが最初によく見えますが、複数桁の数字が再生されるとうまくいかないのです.
第1の例では、数値111は値111の1桁目と比較され、その差は6である.
第2の例では、番号18の1桁目を9番と比較し、その差を−8とする.
正確には、バイナリ比較はバックグラウンドで行われています.
この問題を解決するには、
十分な研究なしでスタックオーバーフローからソリューションをペーストすることは、大きな損害をもたらすことがありえます.
私の場合、テストに使用されている値のため、数日の間、問題は見えませんでした.
ドキュメントをチェックして、ソリューションをテストするより多くの時間を費やすようにしてください.
C/Pを行うことで同様の問題が発生した場合は、コメントを参照ください.
からの解決策
我々がそう示唆された解決を見てみるならば、それはusort()とstrcmp()の機能の組合せです.最初に、彼らは良いコンボのようです.
usort
は、比較に基づいて、以下のように厳密に返します.以下に例を示します:
echo strcmp('3', '7'); // -4
echo strcmp('9', '9'); // 0
echo strcmp('5', '2'); // 3
提案解の問題
1桁の数字を比較すると、すべてが最初によく見えますが、複数桁の数字が再生されるとうまくいかないのです.
echo strcmp('7', '111'); // 6 (expected -104)
echo strcmp('18', '9'); // -8 (expected 9)
何が起こったのですか.数字は全体として比較されていません.第1の例では、数値111は値111の1桁目と比較され、その差は6である.
第2の例では、番号18の1桁目を9番と比較し、その差を−8とする.
正確には、バイナリ比較はバックグラウンドで行われています.
strcmp
は、C言語からtakenである多くの機能のうちの1つです.実装ソリューション
この問題を解決するには、
strcmp
やその他のヘルパー関数を必要としません.比較された引数が整数であることを確信しているなら、私たちは単に必要な結果を得るために良いol '減算を使用することができます(負、0または正の).usort($arrayOfElements, function ($firstElement, $secondElement) {
return $firstElement->getSize() - $secondElement->getSize();
});
また、降順で値をソートする必要がある場合は、subtrahendとminuendを交換します.return $secondElement->getSize() - $firstElement->getSize();
結論
十分な研究なしでスタックオーバーフローからソリューションをペーストすることは、大きな損害をもたらすことがありえます.
私の場合、テストに使用されている値のため、数日の間、問題は見えませんでした.
ドキュメントをチェックして、ソリューションをテストするより多くの時間を費やすようにしてください.
C/Pを行うことで同様の問題が発生した場合は、コメントを参照ください.
Reference
この問題について(ソート時にPHPのstrcmp ()関数に注意してください.), 我々は、より多くの情報をここで見つけました https://dev.to/bornfightcompany/beware-of-php-s-strcmp-function-when-sorting-3ogbテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol