2013-04-25 110 views
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参数传递给array_filter

foreach($items as $item) { 
    $taskid = (int) $goal['goal_id']; 
    echo $taskid; 

将返回无论整数

函数的返回部分也适用,如果我手工设置的值,即

return $task['task_id'] == 2; 

指导赞赏

+1

你在哪里设置$任务? – miah 2013-04-25 18:50:51

+0

$ tasks是一个早期的数组集合,很好,我可以倾倒ti并与它进行交互。如果我使用 返回$ task ['task_id'] == 2; 它一切正常。 – 2013-04-25 18:52:37

+0

但是当我这样做: - echo $ taskid; return $ task ['task_id'] == $ taskid; $ taskid为空 – 2013-04-25 18:54:31

回答

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; 
    }); 
} 
0

array_filter函数将在阵列的值到一个回调函数一个接一个。您不能像使用匿名回调函数一样传递其他参数。

一个有效的例子是:

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

返回

Array ([0] => Bob [1] => Sam) 
3

感谢的人,一旦你指出,这是vairiable范围和匿名函数是很容易在功能关闭引用来解决。

$items[$i]['tasks'] = array_filter($tasks, function($task) use(&taskid){  
    return $task['task_id'] == $taskid; 
    });