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'];し、同じ名前のローカル変数を持っています。これは、array_filter が引数を 1 つしか渡さないため、null です。

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関数は、配列の値をコールバック関数に 1 つずつ渡します。しようとしているように、匿名コールバック関数で他のパラメーターを渡すことはできません。

有効な例は次のとおりです。

$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 に答える