2012-07-19 5 views
4

Я пытаюсь сделать цикл foreach внутри цикла foreach.PHP foreach loop внутри цикла foreach

У меня есть форма, в которой пользователь вводит текст и нажимает отправить. На сайте сервера я просматриваю массив с адресами электронной почты и отправляю текстовое сообщение.

Теперь я также хочу, чтобы пользователь мог использовать переменные в текстовом поле, например $ name. Итак, моя петля должна сначала пройти через электронные письма, а затем str_replace переменную userinput $ name с именами в моем массиве.

Петля отлично работает с электронной почтой ($ tlf), но не заменяет часть $ name.

Может ли какое-то пятно, что я делаю неправильно?

$message = stripslashes(strip_tags($_POST['message2'])); 
$tlf=array("name1","name2"); 
$test=array("mname1", "mname2"); 
$subject = "Hello world"; 
$from = "[email protected]"; 
$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); 
} 

Большое спасибо.

EDIT: Выходное сообщение отправлено. Произнесите тип пользователя в «hello $ name». Я хочу, чтобы он сначала прошел через массив $ tlf, в этом случае создав 2 письма. Это начинается с $ to в первом цикле. Это работает.

Теперь следующий цикл должен распознать пользовательский ввод «hello $ name» и выполнить цикл через массив $ test, заменяющий переменную $ name пользователя.

Выходные данные будут отправлены по электронной почте.

  1. почта выход: к: [email protected] сообщения: Привет mname1

  2. выход почты: к: [email protected] сообщения: Привет mname2

Дайте мне знать, если мне нужно объяснить лучше, мне трудно объяснить, извините.

+0

Каким образом результат неправильный? –

+0

Я забыл упомянуть, что он выводит первое имя в массиве «mname1», но он не выполняет цикл через массив. Это ouput $ test [0] каждый раз .. – Bolli

+0

Спасибо за ответ Nate .. см. Мой последний комментарий. – Bolli

ответ

1

Это то, что вы хотите?

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

foreach($tlf as $contact){ 
    $to = $contact["email"] "@gmail.com"; 
    $replacedMessage = str_replace('$navn', $contact["name"], $message); 
    mail($to,$subject,$replacedMessage,$headers); 
} 
+0

Спасибо за ответ. Моя проблема в том, что второй цикл foreach не проходит через массив. Он просто выводит «mname1» каждый раз. Каждый второй цикл foreach «начинает все», потому что его внутри другого цикла? – Bolli

+0

@ Болли, взгляните на обновленный ответ. – valentinas

+0

Да, это очень похоже на это. Я просто проверил ваш код, не знал, что могу делать массивы в массивах :) - но он все равно выводит «mname2» каждый раз. EDIT: проверив его – Bolli

2

Когда вы делаете следующее:

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

Тогда будет заменен все буквальные вхождений $navn (первый, второй, третий, ...). Таким образом, повторение этого цикла во второй раз не может заменить ничего более.

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

Если вы сказали нам (но вы этого не сделали), вы хотели бы заменить первое появление на каждой итерации, тогда нормальный preg_replace(.., .., .., 1) будет работать.

+0

Большое спасибо! Я получаю это сейчас. Обновит мой пост, как только я его заработаю. – Bolli