1

私は次の構造を持っています:

$email = array(
      4 => array(
          4,  //contains email messages from uids 4 + 3 + 2
          3,  //contains email messages from uids 3 + 2
          2   //contains email message from uid 2
));

私が達成したいことは次のとおりです。

$email = array(
      4 => array(
          4,  //contains email messages from uid 4
          3,  //contains email messages from uid 3
          2   //contains email message from uid 2
));

私の考えでは、スタックの最後からメッセージを取得し、再帰的にツリーを上にトラバースしstr_replace、コンテンツに対して a を実行して、その特定の電子メールのコンテンツのみを残す必要があるということです。これを行う方法がわかりません。

また、

たとえば、メッセージ uid 4 を表示すると、次のように表示される場合があることに気付きました。

On Jul 19, 2013, at 3:28 PM, jonathan@somedomain.com wrote:

また、古いメッセージよりも新しいメッセージが表示され、その後新しいメッセージの署名が表示される場合もあります。

ジョナサン、

{{新しいメッセージはこちら}}

スティーブ、

{{古いメッセージ}}

ジョナサン

ありがとう、スティーブ

ダッシュ ダッシュ ダッシュ

これを実装する方法がわかりません。質問の言い回しが正しく、参考になる十分な情報を提供できたことを願っています。

4

2 に答える 2

0

できます! http://ideone.com/qXysl3

<?php

$msg1 = <<< EOD
Steve,

old message

Jonathan
EOD;

$msg2 = <<< EOD
Jonathan,

new message

On Jul 19, 2013, at 3:28 PM, jonathan@somedomain.com wrote:
{$msg1}

Thanks, Steve
EOD;


$threads = array(
    $msg2 => array(
        $msg2,
        $msg1,
    ),
);


$quote = 'On [a-z]{3} \\d{1,2}, \\d{4}, at \\d{1,2}:\\d{2} (?:AM|PM), [^@\\s]++@[^\\s]++ wrote:';

$new_threads = array();

foreach ($threads as $key => $thread) {

    $tmp = array();
    $prev = null;

    foreach (array_reverse($thread) as $email) {
        if ($prev === null) {
            $tmp[] = $prev = $email;
        } else {
            $pattern = sprintf('/(?:%s|%s)[\\s]*+/i', $quote, preg_quote($prev));
            $tmp[] = $prev = preg_replace($pattern, '', $email);
        } 
    }

    $new_threads[$key] = array_reverse($tmp);

}

foreach ($new_threads as $key => $value) {
    echo "[all]\n{$key}\n\n";
    echo "[msg2]\n{$value[0]}\n\n";
    echo "[msg1]\n{$value[1]}\n\n";
}
于 2013-07-20T22:11:14.400 に答える
0

こんな感じですか?

<?php

$threads = array(
    'baz bar foo' => array(
        'baz bar foo',
        'bar foo',
        'foo',
    ),
);

$new_threads = array();

foreach ($threads as $key => $thread) {

    $tmp = array();
    $prev = null;

    foreach (array_reverse($thread) as $email) {
        switch (true) {
            case $prev === null;
            case ($pos = strrpos($email, $prev)) === false:
                $tmp[] = $email;
                $prev = $email;
                break;
            default:
                $tmp[] = rtrim(substr($email, 0, $pos));
                $prev = $email;
        }
    }

    $new_threads[$key] = array_reverse($tmp);

}

var_dump($new_threads);
于 2013-07-20T21:13:09.953 に答える