我试图围绕PHP中的回调或做什么。
我看过文档,但它们有用吗?
回调的功能是否可以通过简单的功能完成?
答案 0 :(得分:2)
回调用于允许我们将自定义逻辑应用于通用函数,如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);