ループを返すことは可能ですか?結果ではなく、ループ自体です。PHPで関数を作成したい。たとえば、このように。
function myloop($sql){
$query = mysql_query($sql);
return while(mysql_fetch_assoc($query))
}
これを作成したい理由は、コードを繰り返さないようにするためです。誰でも私を助けることができますか?ありがとうございました..
ループを返すことは可能ですか?結果ではなく、ループ自体です。PHPで関数を作成したい。たとえば、このように。
function myloop($sql){
$query = mysql_query($sql);
return while(mysql_fetch_assoc($query))
}
これを作成したい理由は、コードを繰り返さないようにするためです。誰でも私を助けることができますか?ありがとうございました..
Iterator
いいえ、しかし、今日の時点で安定版としてリリースされた PHP でそれをシミュレートできます。PHP 5.5 には、これに近いジェネレーターもあります。
$lazyQuery = new SqlResultItertor($sql);
foreach ($lazyQuery as $assoc) {
$assoc; # the result, one per row
}
ところで:これはすぐに使用できます(遅延クエリではPDO
ありMySqli
ませんが、結果はトラバース可能です)。mysqlの場合、独自のイテレータ結果オブジェクトを作成する必要があります。
一部のmysql_*
関数関連のコードについては、この回答を参照してください。ただし、今日の一般的な提案は、代わりに PDO または mysqli を使用することです。非推奨の mysql_* 関数を使用して古い mysql-php コードを正常に書き換える方法を参照してください。
いいえ、できません。ただし、関数を関数に渡すことはできます。
// 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は、関数だけでなくメソッドや静的メソッドも受け入れるため、コールバックを呼び出す最良の方法であり、より柔軟になります。
いいえ、そうではありません。
ループを実行する以外に何もしない関数を返すことはできますが、ループ自体を返すことはできません。
いいえ。
たとえば、ループを含む可能性のある無名関数を返すことはできますが、言語構造ではなく、関数からのみ値を返すことができます。
裏返せばいいじゃん!
ループを返す代わりに、変数関数を使用して次のようにすることができます。
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 メソッドの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
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のイテレーターで実行できることと大差ありませんが、コードははるかにクリーンです。