Как оптимизировать цикл foreach в PHP - PullRequest
0 голосов
/ 25 марта 2012

Во-первых, я знаю, что название носит общий характер и не подходит.Я просто не мог придумать заголовок, который мог бы описать мою проблему.

У меня есть таблица Получатели в MySQL, структурированная так:

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

Мне нужно преобразовать данные в следующееXML, в зависимости от поля status .Например:

<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>

<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 ]

1 голос
/ 25 марта 2012

С одной петлей вы можете сделать следующее

<?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>
0 голосов
/ 25 марта 2012

Почему бы просто не перебрать получателей один раз и назначить каждому один из 4 списков (по одному для каждого статуса).Затем все, что вам нужно сделать, - это перебрать каждый список для генерации XML.

Хотя это не очень выгодно только для 4 статусов.(Хотя вы действительно профилировали свой код, чтобы увидеть, нужно ли его оптимизировать?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...