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


119

関数での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()関数内でオブジェクトメソッドを呼び出す方法です。

回答:


228

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

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

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

$array = $this->someThingThatReturnAnArray();
usort($array, array('ClassName','merchantSort'));

2
これは素晴らしい!また、sort関数は静的メソッドとして暗黙的に宣言する必要がないことも指摘しておきます。それがまだなくても動作します:)
神保

@Jimbo-それは理にかなっているので、プライベート関数はインスタンス化とクラス変数を使用できます。はい、これは素晴らしいです!$this(ニート)を渡すことができる@decezeの回答もご覧ください。
ベン

5
関数を静的にする必要があります(そうする必要があります)、単にを書くusort($array, 'ClassName:merchantSort')ことができますよね?
2013

8
男これはこれを行うには奇妙な方法のようです。PHP、ああ、どうやって私たちがあなたを愛しているか。
dudewad 2013年

12
@ MarcoW。、ClassNameとmerchantSortの間に2番目の「:」が欠落していると思います。また、関数が同じクラス自体の中で使用されている場合、私はそれを使ってテストし、機能'self::merchantSort'しています。
Pere、


21

あなたは$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 ) );

2番目のセクションが大幅に改善されました。ただし、最初の例ではまだ「)」が欠落しています。
codescribblr 2014

5

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

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

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

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

1
これは、この関数をこの1つの種類でのみ使用している場合にのみ意味があります。多くの場合、同じ比較が多くの場所で使用されます。
シルク

1
これは、私がやるべきことにはぴったりでした。ありがとう!
クリストファースミット

3

Laravel(5.6)モデルクラスでは、次のように呼び出しました。どちらのメソッドも、64ビットのWindowsでphp 7.2を使用してpublic staticです。

public static function usortCalledFrom() 

public static function myFunction()

私はこのようにusortCalledFrom()を呼び出しました

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

これらはどれも機能しませんでした

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

static::クラス名の代わりに、それを言及してくれてありがとう。
2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.