В основном я использую эту удобную функцию для обработки строк 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;
Вы должны использовать use
как описано в документах :
Закрытие также может наследовать переменные из родительской области. Любые такие переменные должны быть объявлены в заголовке функции. Наследование переменных из родительской области не совпадает с использованием глобальных переменных. Глобальные переменные существуют в глобальной области, что то же самое независимо от того, какая функция выполняется.
Код:
$result = ''; fetch("SELECT title FROM tbl", function($r) use (&$result) { $result .= $r['title']; });
Но будьте осторожны (взяты из одного из комментариев в предыдущей ссылке):
use () являются ранними связями – они используют значение переменной в точке, где объявлена функция лямбда, а не точка, в которой вызывается функция лямбда (поздняя привязка).
Как насчет перезаписи 'fetch' для вызова $ func только один раз?
function fetch($query,$func) { $query = mysql_query($query); $retVal = array(); while($r = mysql_fetch_assoc($query)) { $retVal[] = $r; } $func($retVal); }
Таким образом, вы могли бы вызывать $ func только один раз и повторно обрабатывать массив после извлечения? Не уверен в производительности даже при вызове 200 раз функция не кажется хорошей идеей.