2017-01-12 9 views

答えて

1

コールバックは、配列ソートのためにusort()のような汎用関数にカスタムロジックを適用できるようにするために使用されます。特定のプロパティでオブジェクトの配列をソートする。コールバックを使用して、ソートルールを定義できます。

これは私たちがusort()に適用されるコールバックは、私たちはそれを適用することができます私たちは

$data = [ 
    (object) ['myDate' => '2017-01-12'], 
    (object) ['myDate' => '2016-12-25'], 
    (object) ['myDate' => '2017-01-01'], 
]; 

function dateSort($a, $b) { 
    return $a->myDate <=> $b->myDate; 
} 

usort($data, 'dateSort'); 
var_dump($data); 

または匿名関数を使用して

$data = [ 
    (object) ['myDate' => '2017-01-12'], 
    (object) ['myDate' => '2016-12-25'], 
    (object) ['myDate' => '2017-01-01'], 
]; 

function dateSort($a, $b) { 
    return $a->myDate <=> $b->myDate; 
} 

usort($data, function($a, $b) { return $a->myDate <=> $b->myDate; }); 
var_dump($data); 

を作成したことを、標準のPHP関数を使用して定義することができます複雑なロジックは、他のsort()関数は使用できません。


匿名関数は、私たちに多くの柔軟性を与える:usort()又はarray_filter()ようなアレイ機能の多くによって使用されるコールバックは、自動的に関数から特定の引数を受け取り、例えばusort()は配列から2つの値を渡して順序付けします...単純にそれらの2つの値を比較している場合は問題はありません。単純な関数を作成して使用できます。 2016-12-31のような特定の値についてピボットされたソートを行う場合はどうなりますか?その日までの日数をソートしています。私たちは新しい機能、その日付がピボット値として、その中にハードコーディングされたものが必要です。私たちは、動的に私たちのピボット日付値を割り当てたい場合は

$data = [ 
    (object) ['myDate' => '2017-01-12'], 
    (object) ['myDate' => '2016-12-25'], 
    (object) ['myDate' => '2017-01-01'], 
]; 

function dateSort($a, $b) { 
    return abs(strtotime('2016-12-31') - strtotime($a->myDate)) <=> abs(strtotime('2016-12-31') - strtotime($b->myDate)); 
} 

usort($data, 'dateSort'); 
var_dump($data); 

そして今、我々は楽しい部分を取得し、何が起こりますか? usort()コールバックに追加の引数を渡すことはできません。したがって、実行時に '2017-01-06'または '2017-12-26'のピボット値を渡すにはどうすればよいですか?ここで匿名コールバックは特に便利です。なぜなら、useによって、匿名関数にdditional引数を簡単に渡すことができるからです。

​​
関連する問題