Возвращает цикл в функции php

Можно ли вернуть цикл? не результат, а цикл. Я хочу создать функцию в php. Например, вот так.

function myloop($sql){ $query = mysql_query($sql); return while(mysql_fetch_assoc($query)) } 

Причина, по которой я хочу создать это, – это избежать повторения кода. Кто-нибудь может мне помочь? Спасибо..

Нет, ты не можешь. Вы можете передать функцию функции, хотя:

 // The myloop function, with another name. function query($sql, $rowcallback) { $query = mysqli_query($sql); // use mysqli, not mysql while ( ($row = mysql_fetch_assoc($query)) && call_user_func($rowcallback, $row) ); } // The code to process a row. function processRow(array $row) { // Use your row here.. var_dump($row); return true; // You can return false to break processing. } //calling: query($yourSelf, 'processRow'); 

Вместо передачи функции по имени вы также можете использовать анонимные функции, в зависимости от вашей версии php:

 //calling: query($yourSelf, function(array $row) { var_dump($row); return true; // You can return false to break processing. }); 

Функция, которая вызывается из вызываемого абонента, часто называется обратным вызовом . call_user_func – лучший способ вызвать обратный вызов, поскольку он также будет принимать методы и статические методы, а не только функции, поэтому вы более гибкие.

Нет, но вы можете имитировать это с помощью Iterator для стабильного выпуска PHP на сегодняшний день. В PHP 5.5 тоже будут генераторы.

 $lazyQuery = new SqlResultItertor($sql); foreach ($lazyQuery as $assoc) { $assoc; # the result, one per row } 

BTW: PDO и MySqli предлагают это уже из коробки (не ленивый запрос, но результат возможен), для mysql вам нужно написать такой объект результата iterator-result.

Для некоторых функций, связанных с mysql_* , см. Этот ответ . Однако общее предположение на сегодня состоит в том, чтобы вместо этого использовать PDO или mysqli, которые предлагают больше из коробки. См. Как успешно переписать старый код mysql-php с устаревшими функциями mysql_ *?

Нет, это не так.

Вы можете вернуть функцию, чтобы ничего не делать, кроме запуска цикла, но вы не можете вернуть сам цикл.

Нет.

Например, вы можете вернуть анонимную функцию, которая может содержать цикл, но вы можете возвращать значения только из функций, а не из языковых конструкций.

Вы должны вывернуть его наизнанку!

Вместо того, чтобы возвращать цикл, вы можете сделать это таким образом, используя переменные функции :

 function myloop($sql, $myFunction){ $query = mysql_query($sql); while(mysql_fetch_assoc($query)) { $myFunction($result); } } function doSomethingWithTheResult($result) { echo $result; // just to have something here... } //now the usage: myloop("SELECT 1", 'doSomethingWithTheResult'); 

С косоглазием это похоже на концепцию шаблона проектирования ООП- метода шаблона.

Нет, но вы могли бы сделать

 function loopdate($sql,$code) { $query=mysql_query($sql) while (mysql_fetch_assoc($query)) { eval($code); } } 

Однако – eval чрезвычайно опасно, что его действительно обескураживают.

 function loopdate($sql,$function) { $query=mysql_query($sql) while ($data=mysql_fetch_assoc($query)) { $function($data); } } 

было бы лучше.

 myfunc($data) { foreach ($data as $key->$value) { print "<tr><td>".$key."<td><td>".$value."</td></tr>\n"; } } 

Таким образом, вы можете позвонить

 loopdate("select * from mytable","myfunc"); 

В PHP 5.5+ это возможно, используя ключевое слово yield вместо return (это называется генератором ):

 function myloop($sql) { $query = mysql_query($sql); while (($row = mysql_fetch_assoc($query))) { yield $row; } } foreach (myloop('SELECT * FROM foo') as $row) { // do something with $row } 

Это не сильно отличается от того, что вы могли бы сделать с итераторами в более раннем PHP, но код намного чище.