2012-10-19 188 views
4

是否有可能返回一個循環?不是結果,而是自我循環。 我想在php中創建一個函數。例如像這樣。函數返回一個循環php

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

return while(mysql_fetch_assoc($query)) 
} 

我想創建這個的原因是爲了避免重複代碼。任何人都可以幫助我?謝謝..

+6

爲什麼downvotes?好的,這個問題並不是最高質量的,但有一個很好的意圖 - 減少代碼重複。只是這個想法不好,但我認爲這個問題也可能在更多的人身上產生,並且提供一個很好的答案可能會在未來變得更加棘手。 – ppeterka

+0

@ppeterka同意 – GolezTrol

+0

@GolezTrol很高興看到我們有同樣的想法:) – ppeterka

回答

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是調用回調的最佳方式,因爲它也會接受方法和靜態方法,而不僅僅是函數,所以你更靈活。

+0

你能給我一個簡單的例子,我如何實現這一點,如果我太顯示5項?謝謝:) – thenewbie

+0

這並不重要多少項目。你的函數被分別調用每行。 – GolezTrol

+0

我修改了循環,所以你可以返回false來停止處理數據集。 – GolezTrol

1

不,它不是。

您可以返回a function除了運行循環外什麼都不做,但是不能返回循環本身。

1

你可以,例如,返回可能包含一個循環匿名函數,但你只能從功能,而不是語言結構返回

5

不,但你可以模擬一個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

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設計模式的概念。

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

謝謝。順便說一句,如果我能顯示10或5個項目,該如何實現? :) – thenewbie

+0

更新與示例 – BugFinder

+0

謝謝生病嘗試這:) – thenewbie

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