4

foreach ループ内で foreach ループを実行しようとしています。

ユーザーがテキストを入力して送信するフォームがあります。サーバー サイトで、電子メール アドレスの配列をループして、テキスト メッセージを送信します。

ここで、ユーザーが $name などの変数をテキストエリアで使用できるようにしたいと考えています。したがって、私のループは最初に電子メールをループしてから、配列内の名前で userinput $name 変数を str_replace する必要があります。

ループは電子メール部分 ($tlf) では正常に機能しますが、$name 部分の置換では機能しません。

私が間違っていることを誰かが見つけることができますか?

$message = stripslashes(strip_tags($_POST['message2']));
$tlf=array("name1","name2");
$test=array("mname1", "mname2");
$subject = "Hello world";
$from = "me@gmail.com";
$headers = "From: $from";

foreach($tlf as $name){
    $to = $name. "@gmail.com";
    foreach($test as $navn){
        $message = str_replace('$navn', $navn, $message);}
    mail($to,$subject,$message,$headers);
}

どうもありがとう。

編集:出力は送信された電子メールです。ユーザータイプを「hello $name」と言います。最初に $tlf 配列をループして、この場合は 2 つのメールを作成します。これは最初のループで $to として入ります。これは機能します。

これで、次のループでユーザー入力の "hello $name" が認識され、ユーザーの $name 変数を置き換えて $test 配列がループされます。

出力は 2 通のメール送信になります。

  1. メール出力: 宛先: name1@gmail.com メッセージ: こんにちは mname1

  2. メール出力: 宛先: name1@gmail.com メッセージ: こんにちは mname2

もっと詳しく説明する必要がある場合はお知らせください。申し訳ありませんが、説明するのは難しいです。

4

2 に答える 2

2

次の場合:

str_replace('$navn', $navn, $message)

次に、 のすべての文字どおりの出現$navnが置き換えられます (最初、2 番目、3 番目、...)。したがって、そのループを 2 回実行しても、それ以上のものを置き換えることはできません。

2 つのプレースホルダーを定義するか、何らかの区別を行うか、preg_replace_callback置換可能な文字列が適用される順序 (または他のロジック) を宣言する場合に使用する必要があります。

各反復で最初に出現したものだけを置き換えたいと言っていた場合 (まだしていない場合)、法線preg_replace(.., .., .., 1)が機能します。

于 2012-07-19T22:24:58.163 に答える
1

これは、あなたの望むことですか?

$message = stripslashes(strip_tags($_POST['message2']));
$tlf=array(
            array("email" => "name1", "name" => "mname1"),
            array("email" => "name2", "name" => "mname2")
          );
$subject = "Hello world";
$from = "me@gmail.com";
$headers = "From: $from";

foreach($tlf as $contact){
    $to = $contact["email"] "@gmail.com";
    $replacedMessage = str_replace('$navn', $contact["name"], $message);
    mail($to,$subject,$replacedMessage,$headers);
}
于 2012-07-19T22:24:20.750 に答える