是否可以返回循环?不是结果而是循环它自己。 我想在php中创建一个函数。例如像这样。
function myloop($sql){
$query = mysql_query($sql);
return while(mysql_fetch_assoc($query))
}
我想创建这个的原因是我避免重复代码。有人可以帮帮我吗?谢谢..
答案 0 :(得分:5)
不,但是你可以使用Iterator
来模拟今天稳定发布的PHP。在PHP 5.5中,也会有接近的生成器。
$lazyQuery = new SqlResultItertor($sql);
foreach ($lazyQuery as $assoc) {
$assoc; # the result, one per row
}
BTW:PDO
和MySqli
提供了开箱即用(不是延迟查询,但结果是可遍历的),对于mysql,你需要自己编写这样一个迭代器结果对象。
对于某些mysql_*
函数相关代码,请参阅this answer。然而,截至今天的一般建议是使用PDO或mysqli,这些提供更多开箱即用。见How to successfully rewrite old mysql-php code with deprecated mysql_* functions?
答案 1 :(得分:3)
// 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是调用回调的最佳方式,因为它也会接受方法和静态方法,而不仅仅是函数,因此你更灵活。
答案 2 :(得分:1)
不,不是。
您可以返回a function除了运行循环之外什么都不做,但是您无法返回循环。
答案 3 :(得分:1)
没有
例如,您可以返回一个可能包含循环的匿名函数,但是您只能从函数返回 values ,而不是语言结构。答案 4 :(得分:1)
你应该把它翻出来!
您可以使用Variable functions:
这样做,而不是返回循环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');
使用斜视,这类似于Template method OOP设计模式的概念。
答案 5 :(得分:1)
不,但你可以做到
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");
答案 6 :(得分:0)
在PHP 5.5+中,可以使用yield
关键字而不是return
(这称为generator):
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中使用迭代器的方法没什么不同,但代码更清晰。