web-dev-qa-db-ja.com

クラスのプライベート関数でPHPでusortを使用する

oK、関数でusortを使用することはそれほど複雑ではありません

これは私の線形コードで私が以前持っていたものです

function merchantSort($a,$b){
    return ....// stuff;
}

$array = array('..','..','..');

並べ替えるには

usort($array,"merchantSort");

現在、コードをアップグレードし、すべてのグローバル関数を削除して適切な場所に配置しています。これで、すべてのコードはクラス内にあり、usort関数を使用して、単純な関数ではなくオブジェクトメソッドであるパラメーターを使用して配列を並べ替える方法がわかりません

class ClassName {
   ...

   private function merchantSort($a,$b) {
       return ...// the sort
   }

   public function doSomeWork() {
   ...
       $array = $this->someThingThatReturnAnArray();
       usort($array,'$this->merchantSort'); // ??? this is the part i can't figure out
   ...

   }
}

問題は、usort()関数内でオブジェクトメソッドをどのように呼び出すかです

111
Ibu

ソート関数を静的にします:

private static function merchantSort($a,$b) {
       return ...// the sort
}

そして、2番目のパラメーターに配列を使用します。

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
216
Demian Brecht
  1. マニュアルページを開く http://www.php.net/usort
  2. _$value_compare_func_の型がcallableであることを確認してください
  3. リンクされたキーワードをクリックして、到達する http://php.net/manual/en/language.types.callable.php
  4. 構文がarray($this, 'merchantSort')であることを確認してください
70
deceze

_$this_を渡す必要があります。例:usort( $myArray, array( $this, 'mySort' ) );

完全な例:

_class SimpleClass
{                       
    function getArray( $a ) {       
        usort( $a, array( $this, 'nameSort' ) ); // pass $this for scope
        return $a;
    }                 

    private function nameSort( $a, $b )
    {
        return strcmp( $a, $b );
    }              

}

$a = ['c','a','b']; 
$sc = new SimpleClass();
print_r( $sc->getArray( $a ) );
_
14
Justin

この例では、AverageVoteという配列内のフィールドでソートしています。

呼び出し内にメソッドを含めることができます。つまり、次のようにクラススコープの問題はもうありません。

        usort($firstArray, function ($a, $b) {
           if ($a['AverageVote'] == $b['AverageVote']) {
               return 0;
           }

           return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
        });
3
James K

Laravel(5.6)モデルクラスでは、このように呼び出しました。両方のメソッドはパブリックスタティックであり、Windows 64ビットでphp 7.2を使用しています。

public static function usortCalledFrom() 

public static function myFunction()

このようにusortCalledFrom()で呼び出しました

usort($array,"static::myFunction")

これらはどれも仕事ではありませんでした

usort($array,"MyClass::myFunction")
usort($array, array("MyClass","myFunction")
2
hrnsky