4

是否可以返回一个循环?不是结果,而是它自己的循环。我想在 php 中创建一个函数。比如像这样。

function myloop($sql){
$query = mysql_query($sql);

return while(mysql_fetch_assoc($query))
}

我想创建它的原因是为了避免重复代码。任何人都可以帮助我吗?谢谢..

4

7 回答 7

5

Iterator不,但是您可以使用截至今天发布的稳定版本的 PHP来模拟它。在 PHP 5.5 中,也会有接近的生成器。

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

顺便说一句:PDOMySqli提供这个已经开箱即用的(不是惰性查询,但结果是可遍历的),对于 mysql,您需要自己编写这样的迭代器结果对象。

对于一些mysql_*与功能相关的代码,请参阅此答案。然而,截至今天,一般建议是使用 PDO 或 mysqli,它们提供更多开箱即用的功能。请参阅如何使用已弃用的 mysql_* 函数成功重写旧的 mysql-php 代码?

于 2012-10-19T06:51:05.277 回答
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是调用回调的最佳方式,因为它还将接受方法和静态方法,而不仅仅是函数,因此您更灵活。

于 2012-10-19T06:53:14.737 回答
1

不,不是。

您可以返回一个函数,除了运行一个循环之外什么都不做,但您不能返回循环本身。

于 2012-10-19T06:49:07.690 回答
1

不。

例如,您可以返回一个可能包含循环的匿名函数,但您只能从函数返回,而不能从语言构造返回值。

于 2012-10-19T06:49:17.167 回答
1

你应该把它翻过来!

您可以使用变量函数以这种方式执行此操作,而不是返回循环:

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');

眯着眼睛,这类似于模板方法OOP 设计模式的概念。

于 2012-10-19T06:52:16.817 回答
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");
于 2012-10-19T06:53:44.140 回答
0

在 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 中使用迭代器执行的操作没有太大区别,但代码更简洁。

于 2013-02-15T18:25:34.940 回答