ソート時にPHPのstrcmp ()関数に注意してください.


私は複数のプロパティを介してオブジェクトの配列をソートする方法を探していました.いつものように、速いGoglingはスタックオーバーフローに私をナビゲートしました、そこで、私は同じquestionと最も重要なことにそれの答えを見つけました.

からの解決策


我々がそう示唆された解決を見てみるならば、それはusort()strcmp()の機能の組合せです.最初に、彼らは良いコンボのようです.usortは、比較に基づいて、以下のように厳密に返します.
  • 負整数は、最初の引数の値が2番目の
  • より低いことを意味します
  • は、等しい値を暗示します
  • 肯定整数は、第1の引数の値が第2の
  • より大きいことを意味します
    以下に例を示します:
    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を行うことで同様の問題が発生した場合は、コメントを参照ください.