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()関数内でオブジェクトメソッドをどのように呼び出すかです
ソート関数を静的にします:
private static function merchantSort($a,$b) {
return ...// the sort
}
そして、2番目のパラメーターに配列を使用します。
$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));
$value_compare_func
_の型がcallable
であることを確認してくださいarray($this, 'merchantSort')
であることを確認してください_$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 ) );
_
この例では、AverageVoteという配列内のフィールドでソートしています。
呼び出し内にメソッドを含めることができます。つまり、次のようにクラススコープの問題はもうありません。
usort($firstArray, function ($a, $b) {
if ($a['AverageVote'] == $b['AverageVote']) {
return 0;
}
return ($a['AverageVote'] < $b['AverageVote']) ? -1 : 1;
});
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")