传递给array_filter时参数丢失

时间:2013-04-25 18:44:49

标签: php

    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;

指导赞赏

3 个答案:

答案 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 )