Печатать массив в sendmail

Я пытаюсь эхо-массива в теле сообщения sendmail. Я создал функцию для печати массива POST:

function printArray($array, $pad=''){ foreach (array_slice($array, 3) as $key => $value){ echo $pad . "$key: $value <br>"; if(is_array($value)){ printArray($value, $pad.' '); } } } 

Он отлично печатается как через print_r

 printArray($_POST); 

и если положить переменную

 $Parray = printArray($_POST); echo $Parray; 

Но я не получаю это в сообщении sendmail:

 $message = printArray($_POST); mail($to, $subject, print_r($message), $headers); 

Вышеприведенный код отправляет электронное письмо с сообщением «1». Не могу понять, что я делаю неправильно здесь? поскольку массив отлично отлаживается, его просто sendmail, который его не печатает.

Вы используете echo в функции printArray , которая отправляет данные на стандартный вывод (так что вы можете видеть вывод на экране). Но если вы хотите использовать результат функции в переменной (например, $message ), вам нужно вернуть значение из вашей функции.

Поскольку ваша функция является рекурсивной (она вызывает себя), вам придется собирать выходные вызовы функций в локальной переменной, а затем возвращать накопленное значение.

Поэтому я бы printArray() функцию printArray() чтобы вернуть построенное сообщение в виде строки, рядом с ее печатью. Что-то вроде этого:

 function printArray($array, $pad=''){ $buffer = array(); foreach (array_slice($array, 3) as $key => $value){ $buffer[] = $pad . "$key: $value <br>"; if(is_array($value)){ $buffer[] = printArray($value, $pad.' '); } } $output = join('', $buffer); echo $output; return $output; } 

Также, как упоминалось в других ответах, print_r() будет печатать параметр (аналогично функции printArray() в вопросе), но возвращаемое значение не является напечатанным значением, если вы не передадите второй параметр как true , что приведет к тому, что print_r вернет строковое значение.

Функция print_r возвращает 1 если вы не добавили второй параметр TRUE , если вам нужен вывод буфера, затем используйте 2- й параметр true в функции print_r

 $message = print_r($_POST, true); mail($to, $subject, $message, $headers); 

Кажется, $value также может быть array() , поэтому вы не можете напрямую передать $value . Поскольку вы проверили значение is_array() в if() , вы можете разместить echo $pad . "$key: $value <br>"; echo $pad . "$key: $value <br>"; в else части. Можете попробовать:

 function printArray($array, $pad=''){ foreach (array_slice($array, 3) as $key => $value){ if(is_array($value)){ printArray($value, $pad.' '); }else{ echo $pad . "$key: $value <br>"; } } } 

Вы не должны использовать print_r($message) внутри mail() , просто используйте вместо этого $message var. Как mail($to, $subject, $message, $headers);

Также вы ничего не возвращали из printArray() , поэтому

 $Parray = printArray($_POST); echo $Parray; 

здесь echo $Parray; ничего не показывать!

В нижнем разделе

 $message = printArray($_POST); mail($to, $subject, $message, $headers); 

$message is empt() потому что printArray() ничего не делает.