2013-04-13 5 views
0

Представьте себе (даже если это не хороший стиль) у вас есть массив, в который вы добавляете Массивы с некоторым контентом.
Может быть что-то вроде этого:Анонимная функция в php

$result_array = array(); 

foreach(... as $key => $value) { 
    $temp = array(); 
    $temp["start"] = $value->start; 
    $temp["end"] = $value->end; 
    $result_array[] = $temp; 
} 

// Image it will produce for example an $result_array like this: 
    array(
     array("start" => 10, "end" => 20), 
     array("start" => 100, "end" => 120) 
    ); 

До сих пор так хорошо. Теперь давайте сделаем некоторые такие грязные вещи: Я хочу добавить анонимную функцию, которая возвращает интервал между стартом и end в каждом temp_array. Это может выглядеть примерно так:

foreach(... as $key => $value) { 
    $temp = array(); 
    $temp["start"] = $value->start; 
    $temp["end"] = $value->end; 
    $temp["duration"] = function() { return abs(__START__ - __END__); } 
    $result_array[] = $temp; 
} 

Как я нахожусь в «Array», и я не знаю, мой индекс, как я могу получить доступ к времени начала и окончания?

Пожалуйста, не пламените меня за плохой стиль или синтаксические ошибки, это просто пример, который я записал в поле вопроса.

Заранее спасибо.

ответ

1

Анонимная функция не имеет никакого отношения к ее «массиву контекстов». Вы не можете получить значения массива, в котором находится функция, потому что нет никакой неотъемлемой связи между функцией и массивом. Лучшее, что вы можете сделать, это дать ему значения через замыкание при создании:

$temp['duration'] = function() use ($value) { return abs($value->start - $value->end); } 

Это не работает в цикле, конечно, так как значение $value изменений, так что вам нужна функция производства функции, чтобы сломать что ссылка:

$temp['duration'] = call_user_func(function ($v) { 
    return function() use ($v) { return abs($v->start - $v->end); }; 
}, $value); 

Я не уверен, почему вы бы пройти через все эти проблемы, хотя вместо того, чтобы просто расчета и вставки значения в массив, как обычно.

1

Я действительно не знаю, если по какой-то причине (неизвестной мне) это плохая практика, но вы можете использовать ссылки, как это:

$temp["start"] = $value->start; 
$start = &$temp["start"]; 
$temp["end"] = $value->end; 
$end = &$temp["end"]; 
$temp["duration"] = function() use (&$start, &$end) { return abs($start - $end); }; 

Кстати, есть причина, вы хотите сделать «ленивую» операцию по этим ценностям?

+0

ленивая операция? –

+0

Извините, я просто имел в виду, почему вы не можете просто вычислить значение во время цикла, вместо использования анонимной функции. Знают ли эти значения после этого цикла? – Uby

Смежные вопросы