Доступ к внешней переменной с использованием анонимной функции в качестве параметров

В основном я использую эту удобную функцию для обработки строк db (закрывайте глаза на PDO и/или другие вещи)

function fetch($query,$func) {
    $query = mysql_query($query);   
    while($r = mysql_fetch_assoc($query)) {
        $func($r);
    }
}

С помощью этой функции я могу просто сделать:

fetch("SELECT title FROM tbl", function($r){
   //> $r['title'] contains the title
});

Скажем, теперь мне нужно объединить все $r['title'] в var (это только пример).

Как я мог это сделать? Я думал что-то вроде этого, но это не очень элегантно:

$result = '';
fetch("SELECT title FROM tbl", function($r){
   global $result;
   $result .= $r['title'];
});

echo $result;

Ответ 1

Вы должны использовать use как описанный в документах:

Закрытие также может наследовать переменные из родительской области. Любая такая переменные должны быть объявлены в заголовке функции. Наследование переменные из родительской области не совпадают с использованием глобальных переменные. Глобальные переменные существуют в глобальном масштабе, независимо от того, какая функция выполняет.

код:

$result = '';
fetch("SELECT title FROM tbl", function($r) use (&$result) {
   $result .= $r['title'];
});

Но будьте осторожны (взяты из одного из комментариев в предыдущей ссылке):

Параметры

use() являются ранними связями - они используют значение переменной в точка, где объявлена ​​лямбда-функция, а не точка где лямбда-функция называется (поздняя привязка).

Ответ 2

Как насчет перезаписи 'fetch' для вызова $func только один раз?

function fetch($query,$func) {
    $query = mysql_query($query);   
    $retVal = array();
    while($r = mysql_fetch_assoc($query)) {
        $retVal[] = $r;
    }
    $func($retVal);
}

Таким образом, вы могли бы вызывать $func только один раз и повторно обрабатывать массив после извлечения? Не уверен в производительности даже при вызове 200 раз функция не похожа на хорошую идею.