Как вывести массив в сообщения электронной почты, содержащие объединенные данные?

У меня есть массив с данными, который выглядит так:

01 | organization_1 | email_A | publication_A1 | pubID_A1
02 | organization_1 | email_A | publication_A2 | pubID_A2
03 | organization_1 | email_A | publication_A3 | pubID_A3
04 | organization_2 | email_B | publication_B1 | pubID_B1
05 | organization_2 | email_B | publication_B2 | pubID_B2
06 | organization_3 | email_C | publication_C1 | pubID_C1
07 | organization_4 | email_D | publication_D1 | pubID_D1
08 | organization_4 | email_D | publication_D2 | pubID_D2

Массив устроен так:

array('org' => organization_x, 'email' => email_x, 'title' => publication_x, 'pub_id' => pubID_x).

Что мне нужно сделать, так это вывести этот массив, чтобы он отображался как отдельные сообщения электронной почты с кнопкой отправки после каждого. Человек, просматривающий эту страницу, просматривает отображаемое сообщение, и у него или у нее будет возможность нажать кнопку «Отправить», чтобы отправить сообщение на соответствующий адрес электронной почты. Вот начальный дисплей, который нам нужно создать:

<!-- Message #1 -->
<form>
<input type="hidden" name="pub_ids" value="pubID_A1;pubID_A2;pubID_A3">
<input type="hidden" name="recipient" value="email_A">
<input type="hidden" name="organization" value="organization_1">
<!-- start on-screen text display -->
To: email_A

Your account contains the following publication titles:

* publication_A1
* publication_A2
* publication_A3

You can edit these publications after logging into our system. Your email 
address, email_A, serves as your username.

Thanks!
<!-- end on-screen text display -->
<input type="submit" name="submit" value="submit">
</form>

<!-- Message #2 -->
<form>
<input type="hidden" name="pub_ids" value="pubID_B1;pubID_B2">
<input type="hidden" name="recipient" value="email_B">
<input type="hidden" name="organization" value="organization_2">
<!-- start on-screen text display -->
To: email_B

Your account contains the following publications:

* publication_B1
* publication_B2

You can edit these publications after logging into our system. Your 
email address, email_B, serves as your username.

Thanks!
<!-- end on-screen text display -->
<input type="submit" name="submit" value="submit">
</form>

...и так до тех пор, пока не будут обработаны все элементы массива.

Я слишком долго пробовал какую-то версию следующего кода. Идея состоит в том, чтобы пройтись по каждому элементу, объединяя данные pub_id и title в текстовые строки, которые будут передаваться через форму или отображаться на экране по мере необходимости. Когда сценарий достигает нового имени организации, он должен собрать все части воедино, а затем приступить к работе со следующим сообщением электронной почты организации.

$current_org = '';
$pub_ids = '';
$titles = '';

foreach ($array AS $value)
{
    $pub_ids .= $value['pub_id'] . ';';
    $titles .= '* ' . $value['title'] . '<br />';
    if ($current_org != $value['org'])
    {
        echo '<form>';
        echo '<input type="hidden" name="pub_ids" value="' . $pub_ids . '">';
        echo '<input type="hidden" name="recipient" value="' . $value['email'] . '">';
        echo '<input type="hidden" name="organization" value="' . $value['org'] . '">';
        echo 'To: ' . $value['email'];
        echo '<br /><br />';
        echo 'Your account contains the following publication titles:';
        echo '<blockquote>';
        echo $titles;
        echo '</blockquote>';
        echo 'You can edit these publications after logging into our system. Your email address, ' . $value['email'] . ', serves as your username.';
        echo '<br /><br />';
        echo 'Thanks!';
        echo '<input type="submit" name="submit" value="submit">';
        echo '</form>';
        echo '<br /><br />';
        $pub_ids = '';
        $titles = '';
        $current_org = $value['org'];
    }
}

Но на самом деле я получаю, например, , pub_id, которые выглядят так:

1-е сообщение: ‹input type="hidden" name="pub_ids" value="pubID_A1"›

2-е сообщение: ‹input type="hidden" name="pub_ids" value="pubID_A1;pubID_A2"›

3-е сообщение: ‹input type="hidden" name="pub_ids" value="pubID_A1;pubID_A2;pubID_A3"›

4-е сообщение: ‹input type="hidden" name="pub_ids" value="pubID_A1;pubID_A2;pubID_A3;pubID_B1"›

5-е сообщение: ‹input type="hidden" name="pub_ids" value="pubID_A1;pubID_A2;pubID_A3;pubID_B1;pubID_B2"›

Редактировать: добавлены $pub_ids = '' и $titles = '' всякий раз, когда сценарий начинается заново. Теперь это отражено в приведенном выше коде ближе к концу foreach().

Теперь проблема, похоже, заключается в том, что первая организация с более чем одной публикацией получает только одну публикацию в списке. Затем следующая организация получает в списке публикацию последней организации, а также свою собственную. Потом остальные скидываются. Что-то делать с первым оператором if()? Поскольку $current_org начинается с NULL, первый цикл никогда не будет установлен в $value['org']. Я не могу понять, как это исправить, хотя. Где/как я могу проверить, изменилось ли значение организации?

Любое понимание этой проблемы очень ценится!


person user1286755    schedule 21.06.2013    source источник


Ответы (2)


Я отправил этот вопрос на phpFreaks, а также на StackOverflow. Баранд из Великобритании дал потрясающий ответ, решив мои проблемы. Вы можете увидеть его ответ здесь: http://forums.phpfreaks.com/topic/279455-how-to-output-an-array-into-email-messages-content-concatenated-data/#entry1437523. Я также скопировал / вставил ниже. Работает как шарм. Надеюсь, это полезно для кого-то еще.

Try:

$arr = array (
    array('org' => organization_w, 'email' => email_w, 'title' => publication_w1, 'pub_id' => pubID_w1),
    array('org' => organization_w, 'email' => email_w, 'title' => publication_w2, 'pub_id' => pubID_w2),
    array('org' => organization_w, 'email' => email_w, 'title' => publication_w3, 'pub_id' => pubID_w3),
    array('org' => organization_x, 'email' => email_x, 'title' => publication_x1, 'pub_id' => pubID_x1),
    array('org' => organization_x, 'email' => email_x, 'title' => publication_x2, 'pub_id' => pubID_x2),
    array('org' => organization_x, 'email' => email_x, 'title' => publication_x3, 'pub_id' => pubID_x3),
    array('org' => organization_y, 'email' => email_y, 'title' => publication_y1, 'pub_id' => pubID_y1),
    array('org' => organization_y, 'email' => email_y, 'title' => publication_y2, 'pub_id' => pubID_y2),
    array('org' => organization_z, 'email' => email_z, 'title' => publication_z, 'pub_id' => pubID_z)
);

$currOrg = '';
foreach ($arr as $data) {
    if ($currOrg != $data['org']) {
        if ($currOrg) {
            outputEmail ($currOrg, $currEmail, $titles, $ids);
        }
        $currOrg = $data['org'];
        $currEmail = $data['email'];
        $titles = $ids = array();
    }
    $titles[] = $data['title'];
    $ids[] = $data['pub_id'];
}
outputEmail ($currOrg, $currEmail, $titles, $ids);

function outputEmail($org, $email, $titles, $ids)
{
    // format your output here
    echo "Organisation: $org<br>";
    echo "Email: $email<br>";
    echo "Titles: " . join(', ', $titles) . '<br>';
    echo "Ids: " . join(', ', $ids) . '<hr>';
}
person user1286755    schedule 24.06.2013

Изменять

$pub_ids .= $value['pub_id'] . ';';
$titles .= '* ' . $value['title'] . '<br />';

для этого:

$pub_ids = $value['pub_id'] . ';';
$titles = '* ' . $value['title'] . '<br />';

вы должны удалить конкатенацию

person Emilio Gort    schedule 21.06.2013
comment
Привет и спасибо Эмилио - но это не сработало. Изменение кода, как вы предлагаете, дает мне только одну публикацию на сообщение. Есть ряд организаций, которые имеют более одной публикации. Это изменение означает, что вы получаете только один. Любые другие идеи? - person user1286755; 22.06.2013
comment
Одна вещь, которую я пробовал, — это очищать $pub_ids и $titles всякий раз, когда скрипт запускается заново. Теперь это отражено в моем исходном посте в конце foreach(). Исправлена ​​исходная проблема, из-за которой элементы просто продолжали добавляться в конкатенированные строки pub_ids и titles. НО теперь в какой-то момент вывод неверен. Похоже, первая организация с более чем одной публикацией получает в список только одну публикацию. Затем следующая организация получает в списке публикацию последней организации, а также свою собственную. Потом остальные скидываются? - person user1286755; 22.06.2013