如何在PHP中优化foreach循环

时间:2012-03-24 22:26:39

标签: php mysql foreach

首先,我知道标题是通用的,不合适。我想不出一个可以描述我问题的标题。

我在MySQL中有一个表格收件人结构如下:

id   |   email   |   status
1      foo@bar         S
2      bar@baz         S
3      abc@def         R
4      sta@cko         B

我需要将数据转换为以下XML,具体取决于状态字段。例如:

<Recipients>
    <RecipientsSent>
        <!-- Have the 'S' status -->
        <recipient>foo@bar</recipient>
        <recipient>bar@baz</recipient>
    </RecipientsSent>

    <RecipientsRegexError>
        <recipient>abc@def</recipient>
    </RecipientsRegexError>

    <RecipientsBlocked>
        <recipient>sta@cko</recipient>
    </RecipientsBlocked>
</Recipients>

我有这个PHP代码来实现这个($ recipients包含db表的关联数组):

<Recipients>

<RecipientsSent>
<?php
foreach ($recipients as $recipient):
    if ($recipient['status'] == 'S'):
        echo "<recipient>" . $recipient['email'] . "</recipient>";
    endif;
endforeach;
?>
</RecipientsSent>

<RecipientsRegexError>
<?php
foreach ($recipients as $recipient):
    if ($recipient['status'] == 'R'):
        echo "<recipient>" . $recipient['email'] . "</recipient>";
    endif;
endforeach;
?>
</RecipientsRegexError>
<?php /** same loop for the B status */ ?>

</Recipients>

所以,这意味着如果表中有1000个条目,可以检查4个不同的状态,则表示将有4个循环,每个循环执行1000次。

如何以更有效的方式完成?我想从数据库中获取四个不同的集合,这意味着4个不同的查询,会更有效吗?我认为可以通过一个循环完成,但我无法提出解决方案。

任何方式只需一个循环即可完成?

2 个答案:

答案 0 :(得分:1)

使用一个循环,您可以执行以下操作

<?php

$string1, $string2 = '';

foreach ($recipients as $recipient) {
  $recipient_email = "<recipient>" . $recipient['email'] . "</recipient>";

  switch($recipient['status']) {
    case 'a':
      $string1 .= $recipient_email;
      break;
    case 'b':
      $string2 .= $recipient_email;
      break;
  }
}
?>

<Recipients>
  <RecipientsSent>
    <?php echo $string1; ?>
  </RecipientsSent>
  <RecipientsRegexError>
    <?php echo $string2; ?>
  </RecipientsRegexError>
</Recipients>

答案 1 :(得分:0)

为什么不只是循环收件人一次,并将每个分配给4个列表中的一个(每个状态一个)。然后,您需要做的就是遍历每个列表以生成XML。

但是,仅仅有4种状态并没有太大的好处。 (尽管如此,您是否真的已经分析过代码以确定是否需要对其进行优化?)