【问题标题】:PHP Looping and foreachPHP循环和foreach
【发布时间】:2013-05-14 05:48:30
【问题描述】:

我会用一个例子来解释我的问题。

  1. 我有一组电子邮件 ID(从 db 获取,它将是动态的)。假设有 100 个电子邮件 ID

  2. 我需要将它们分组为 10。换句话说,100 个电子邮件 ID 除以 10 => 所以会有 10 个循环。

  3. 输出应该是这样的

组 1: ---前十个电子邮件ID---

组 2: ---接下来的十个电子邮件ID--- . . . . ..

组 3: ---最后十个电子邮件ID---

这是我的 php 代码(我已经修改/更正了我的代码)

    <?php
    $con=mysql_connect("localhost","root","admin");
    mysql_select_db("test1",$con);
    $sel=mysql_query("SELECT DISTINCT emailaddress FROM userlist");
    while($row=mysql_fetch_array($sel))
    {
    $mail[]=$row['emailaddress'];
    }


    $chunk = array_chunk($mail, 10);
    $get_chunk_count = count($chunk);


    for($i=0;$i<$get_chunk_count;$i++){
    echo "Group :".$i;
    echo "<br>";
    echo "========";
    echo "<br>";
    $count_inside_count = count($chunk[$i]);

    for($j=0;$j<=$count_inside_count;$j++){
    echo "<pre>";
    echo $chunk[$i][$j];
    echo "</pre>";
    }
    }
    ?>

已编辑:上面的代码工作正常,我已编辑。感谢所有帮助:)

【问题讨论】:

  • MySQLmysql_* 函数)扩展名是 deprecated。我建议改用MySQLimysqli_* 函数)或PDO
  • 哦,不……你能解释一下为什么需要使用 MySQLi 或 PDO 吗?
  • 关注link
  • 您想每隔 10 秒打印 10 封电子邮件吗?????
  • @aligarian - 是的,你完全正确。帮帮我!!!

标签: php mysql for-loop foreach


【解决方案1】:

您可以使用 PHP 的 array_chunk() 函数将您的数组分成更小的块。

未测试,但我认为应该非常接近。

$chunk = array_chunk($mail, 10);
$i = 0;
do
{
    echo $chunk[$i] . '<br />';
    $i++;
    if($i == 10)
        sleep(10);
} while ($i < count($chunk)); 

【讨论】:

  • 另外,我建议注意PHP的max_execution_time设置。查看set_time_limit()
  • 啊,是的,非常好。我认为 10 秒的暂停不会成为问题,因为 PHP 的默认执行时间是 30 秒,但不能保证在这种环境中是这种情况。
  • Michael O'Brien - 感谢您的帮助。您的回答对我帮助很大,我已经更新了我的代码。它工作完美。你太棒了!!!
【解决方案2】:

当您可以将它们打印成单独的块时,我不确定为什么要将它们分成组;但是,如果我通过使用这种 php sleep 方法正确理解了您的目标,您应该能够打印 10 个 ID 等待 10 秒,然后打印接下来的 10 个 ID 等,直到您的完整列表用完为止。

   $temp = 0;
   for($i=1;$i<=$no_of_emails;$i++){
     echo "stuff";
     temp++;
     if(temp == 10){
       sleep(10);  
       temp = 0;
     }
   }

【讨论】:

  • 请再次检查我的问题。我不担心睡眠。但我想创建一个组并首先打印十个电子邮件 ID,依此类推..
【解决方案3】:

如果我理解正确——下面的代码会为你工作......

$con=mysql_connect("localhost","root","admin");
mysql_select_db("test1",$con);
$sel=mysql_query("SELECT DISTINCT emailaddress FROM userlist");
$email=mysql_fetch_array($sel);
 $num_rows=mysql_num_rows($sel);
$counter = 0;
for($i=1;$i<=$num_rows;$i++){
 echo $email[$i];
 $counter++;
 if($counter== 10){
   sleep(10);  
   $counter= 0;
 }

}

【讨论】:

  • 请再次检查我的问题。我不担心睡眠。但我想创建一个组并首先打印十个电子邮件 ID,依此类推..
【解决方案4】:

不清楚为什么要将电子邮件列表拆分为 10 个堆栈,顺便说一句,这是一个工作代码(正如有人指出的那样,你真的应该考虑 PDO 而不是 mysql_* 函数,所以我用两者编写了示例):

// Mysql, DEPRECATED.
//$q = mysql_connect('localhost', 'YOURDBUSER', 'YOURDBPASSWD');
//mysql_select_db('YOURDBNAME');
//$query = mysql_query('SELECT DISTINCT emailaddress FROM userlist');
//$n = mysql_num_rows($query);

// PDO
$dblink = new PDO('mysql:dbname=YOURDBNAME;host=localhost', 'YOURDBUSER', 'YOURDBPASSWD');
$query = $dblink->query("SELECT DISTINCT emailaddress FROM userlist");
$n = $query->rowCount();


$step = 10;
for($i = 0; $i < $n; $i++)
{
  //  Mysql
  //$res = mysql_fetch_assoc($query);
  // Pdo
  $res = $query->fetch(PDO::FETCH_ASSOC);

  if(!($i % $step))
  {
    // Here we have collected 10 email addresses.
    echo "---SEPARATOR---\n";
  }
  echo $res['emailaddress'] . "\n";
}

编辑 对于所有建议sleep的人:它不会起作用。 “每 10 秒打印 10 封电子邮件”不支持睡眠:执行 php 代码后页面输出到达浏览器 (server-side)

如果你想达到这个效果,你应该努力使用output buffering,我不确定是否可能。

也许是阿贾克斯。

【讨论】:

    【解决方案5】:

    你可以试试这个代码:

    $con=mysql_connect("localhost","root","admin");
    mysql_select_db("test1",$con);
    $sel=mysql_query("SELECT DISTINCT emailaddress FROM userlist");
    $mailsGroups = array();
    $i = 0;
    $j = -1;
    $mailsPerGroup = 10;
    
    while($row=mysql_fetch_array($sel))
    {
        if ($i % $mailsPerGroup == 0) {
            $j++;
            $mailsGroups[$j] = array();
        }
        $mailsGroups[$j][]=$row['emailaddress'];
        $i++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2012-07-19
      • 2010-12-17
      • 2015-12-10
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      相关资源
      最近更新 更多