foreach( $items as $item) {
$taskid = (int) $goal['goal_id'];
$items[$i]['tasks'] = array();
$items[$i]['tasks'] = array_filter($tasks, function($task, $taskid){
return $task['task_id'] == $taskid;
});
为什么$ taskid没有被传递给array_filter函数,如果从内部回显它会返回null但是如果在设置它之后回显它会给出正确的值,例如。
foreach( $items as $item) {
$taskid = (int) $goal['goal_id'];
echo $taskid;
将返回整数
如果我手动设置一个值,即
,函数的返回部分也有效 return $task['task_id'] == 2;
指导赞赏
答案 0 :(得分:5)
问题是变量范围和函数参数。
首先,array_filter需要一个带有单个参数的函数,该参数是数组中位置的值。它不处理密钥。
您在匿名函数之外设置$taskid = (int) $goal['goal_id'];
,并且您有一个同名的局部变量,该变量为null,因为array_filter只传递一个参数。
foreach( $items as $item) {
$taskid = (int) $goal['goal_id'];
$items[$i]['tasks'] = array();
# Per the OP, you can pass the necessary variable in via 'use'
$items[$i]['tasks'] = array_filter($tasks, function($task) use($taskid){
return $task['task_id'] == $taskid;
});
}
答案 1 :(得分:3)
感谢大家,一旦你指出它是变量范围和匿名函数,它很容易通过函数闭包中的引用来修复。
$items[$i]['tasks'] = array_filter($tasks, function($task) use(&taskid){
return $task['task_id'] == $taskid;
});
答案 2 :(得分:0)
array_filter
函数将数组值一个接一个地传入回调函数。您无法像尝试那样使用匿名回调函数传递其他参数。
一个有效的例子是:
$array = ["Bob","Sam","Jack"];
print_r(
array_filter(
$array,
function($value) {
return ($value !== 'Jack');
}
)
);
返回
Array ( [0] => Bob [1] => Sam )