函数返回一个循环php

问题描述:

是否有可能返回一个循环?不是结果,而是自我循环。 我想在php中创建一个函数。例如像这样。函数返回一个循环php

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

return while(mysql_fetch_assoc($query)) 
} 

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

+6

为什么downvotes?好的,这个问题并不是最高质量的,但有一个很好的意图 - 减少代码重复。只是这个想法不好,但我认为这个问题也可能在更多的人身上产生,并且提供一个很好的答案可能会在未来变得更加棘手。 – ppeterka

+0

@ppeterka同意 – GolezTrol

+0

@GolezTrol很高兴看到我们有同样的想法:) – ppeterka

不,你不能。你可以通过一个函数的功能,但:

// 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是调用回调的最佳方式,因为它也会接受方法和静态方法,而不仅仅是函数,所以你更灵活。

+0

你能给我一个简单的例子,我如何实现这一点,如果我太显示5项?谢谢:) – thenewbie

+0

这并不重要多少项目。你的函数被分别调用每行。 – GolezTrol

+0

我修改了循环,所以你可以返回false来停止处理数据集。 – GolezTrol

不,它不是。

您可以返回a function除了运行循环外什么都不做,但是不能返回循环本身。

你可以,例如,返回可能包含一个循环匿名函数,但你只能从功能,而不是语言结构返回

不,但你可以模拟一个Iterator为稳定发布的PHP截至今天。在PHP 5.5中,也会有接近的生成器。

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

BTW:PDOMySqli提供本已开箱(不懒查询,但结果是穿越),为MySQL你需要写这样一个迭代器结果对象自己。

对于部分功能相关代码mysql_*,请参阅this answer。然而,今天的一般建议是使用PDO或mysqli代替,这些提供更多的开箱即用。见How to successfully rewrite old mysql-php code with deprecated mysql_* functions?

+0

我会试试这个。我更熟悉mysql。但是,谢谢你的提示 – thenewbie

+0

@thenewbie:你可能会发现这有帮助然后:http://www.php.net/manual/en/mysqli.quickstart.dual-interface.php - 然而关于你问你的问题的好处,你想有一个面向对象的接口。 Mysqli和PDO将帮助你不要为此编写太多的代码(最终)。 – hakre

你应该把它翻出来!

,而不是返回循环的,你能做到这一点使用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设计模式的概念。

没有,但你可以做

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"); 
+0

谢谢。顺便说一句,如果我能显示10或5个项目,该如何实现? :) – thenewbie

+0

更新与示例 – BugFinder

+0

谢谢生病尝试这:) – thenewbie

在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中的迭代器可以做的事情没有什么不同,但代码更清晰。