首先,我知道标题是通用的,不合适。我想不出一个可以描述我问题的标题。
我在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个不同的查询,会更有效吗?我认为可以通过一个循环完成,但我无法提出解决方案。
任何方式只需一个循环即可完成?
答案 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种状态并没有太大的好处。 (尽管如此,您是否真的已经分析过代码以确定是否需要对其进行优化?)