我正试图了解回调是什么或在PHP中做什么。
我看过这些文档,但它们有什么用处?
回调所做的事情是不是在简单函数中无法完成的?
回调用于允许我们将自定义逻辑应用于像usort()
这样的泛型函数以进行数组排序,如果我们想要比基本排序函数提供的更复杂的排序逻辑。。。例如,按特定属性对对象数组进行排序。使用回调,我们可以定义排序规则。
这可以使用标准的PHP函数来定义,我们已经创建了
$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'],
];
usort($data, function($a, $b) { return $a->myDate <=> $b->myDate; });
var_dump($data);
因此,我们应用于usort()
的回调允许我们应用其他sort()
函数无法使用的复杂逻辑。
匿名函数给了我们更多的灵活性:许多数组函数(如usort()
或array_filter()
)使用的回调会自动接收函数中的某些参数,例如usort()
会从数组中传递两个值以进行排序。。。如果你只是简单地比较这两个值,你可以创建一个简单的函数并使用它;但是,如果我们想排序,以某个值为中心,比如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
:轻松地将附加参数传递给匿名函数
$data = [
(object) ['myDate' => '2017-01-12'],
(object) ['myDate' => '2016-12-25'],
(object) ['myDate' => '2017-01-01'],
];
$pivotDate = '2017-01-06';
usort(
$data,
function ($a, $b) use ($pivotDate){
return abs(strtotime($pivotDate) - strtotime($a->myDate)) <=> abs(strtotime($pivotDate) - strtotime($b->myDate));
});
var_dump($data);