是否有可能返回一個循環?不是結果,而是自我循環。 我想在php中創建一個函數。例如像這樣。函數返回一個循環php
function myloop($sql){
$query = mysql_query($sql);
return while(mysql_fetch_assoc($query))
}
我想創建這個的原因是爲了避免重複代碼。任何人都可以幫助我?謝謝..
是否有可能返回一個循環?不是結果,而是自我循環。 我想在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是調用回調的最佳方式,因爲它也會接受方法和靜態方法,而不僅僅是函數,所以你更靈活。
不,它不是。
您可以返回a function除了運行循環外什麼都不做,但是不能返回循環本身。
號
你可以,例如,返回可能包含一個循環匿名函數,但你只能從功能,而不是語言結構返回值。
不,但你可以模擬一個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?
你應該把它翻出來!
,而不是返回循環的,你能做到這一點使用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");
在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中的迭代器可以做的事情沒有什麼不同,但代碼更清晰。
爲什麼downvotes?好的,這個問題並不是最高質量的,但有一個很好的意圖 - 減少代碼重複。只是這個想法不好,但我認爲這個問題也可能在更多的人身上產生,並且提供一個很好的答案可能會在未來變得更加棘手。 – ppeterka
@ppeterka同意 – GolezTrol
@GolezTrol很高興看到我們有同樣的想法:) – ppeterka