【发布时间】:2017-01-12 09:53:40
【问题描述】:
我正试图围绕 PHP 中的回调是什么或做什么。
我看过文档,但它们有什么用?
有没有什么是回调函数不能在简单函数中完成的?
【问题讨论】:
我正试图围绕 PHP 中的回调是什么或做什么。
我看过文档,但它们有什么用?
有没有什么是回调函数不能在简单函数中完成的?
【问题讨论】:
如果我们想要一个比基本排序函数提供的更复杂的排序逻辑...例如按特定属性对对象数组进行排序。使用回调,我们可以定义排序规则。
这可以使用我们创建的标准 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);
【讨论】: