1
    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;

指导赞赏

4

3 回答 3

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;
  });
}
于 2013-04-25T18:55:53.550 回答
3

谢谢你,一旦你指出它是可变范围和匿名函数,它很容易通过在函数闭包中引用来修复。

    $items[$i]['tasks'] = array_filter($tasks, function($task) use(&taskid){    
    return $task['task_id'] == $taskid;
    });
于 2013-04-25T19:14:26.943 回答
0

array_filter函数将数组值一一传递给回调函数。您不能像您尝试做的那样使用匿名回调函数传递其他参数。

一个有效的例子是:

$array = ["Bob","Sam","Jack"];
print_r(
    array_filter(
        $array, 
        function($value) { 
            return ($value !== 'Jack'); 
        }
    )
);

退货

Array ( [0] => Bob [1] => Sam ) 
于 2013-04-25T18:56:03.303 回答