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
}

ところで:これはすぐに使用できます(遅延クエリではPDOありMySqliませんが、結果はトラバース可能です)。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');

目を細めると、これはTemplate メソッドの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 に答える