2013-04-25 58 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; 
    });