Как да изведа масив в имейл съобщения, съдържащи свързани данни?

Имам масив с данни, който изглежда така:

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 и данните за заглавието в текстови низове, които да бъдат предадени през формуляра или показани на екрана, ако е необходимо. Когато скриптът достигне ново име на организация, той трябва да събере всички части и след това да започне с имейл съобщението на следващата организация.

$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_ids, които изглеждат така:

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