что означает запятая в выражении эха?

Я пытаюсь повторить строку из функции Рекурсивная:
echo "<li>", $node, recurse($arr), "</li>";
а также
echo "<li>" . $node . recurse($arr) . "</li>";

 function writeList($tree) { if($tree == null) return; echo "<ul>"; foreach($tree as $node=>$children) { echo "<li>", $node, writeList($children) , "</li>"; } echo "</ul>"; } 

$tree – это древовидная структура, которая может быть найдена в этом вопросе (form2)

И, я могу заметить, что результат от двух отличается.
Может кто-то сказать мне разницу в использовании , и . в общем, и в частности, в этом примере?

EDIT : что, если вместо того, чтобы повторять строки, я хочу сохранить строку, сгенерированную из этой функции в переменной. Меня особенно интересует результат, полученный от первого echo заявления.

EDIT: Я питаюсь этим массивом:

 array 3 => array 4 => array 7 => null 8 => array 9 => null 5 => null 6 => null 

Выходы, которые я получаю:
(из первого выражения эха)

 <ul><li>3<ul><li>4<ul><li>7</li><li>8<ul><li>9</li></ul></li></ul></li><li>5</li></ul></li><li>6</li></ul> 

(из второго эхо-заявления)

 <ul><ul><ul><li>7</li><ul><li>9</li></ul><li>8</li></ul><li>4</li><li>5</li></ul><li>3</li><li>6</li></ul> 

EDIT: Хорошо, я понял. Преступником является ваша writeList() . Внутри этой функции есть вторичное echo .

Когда вы это сделаете:

 echo "<li>", $node, writeList($arr), "</li>"; 

Каждая часть сначала оценивается, а затем распечатывается. Это эквивалентно:

 echo "<li>"; echo $node; echo writeList($arr); echo "</li>"; 

Но когда вы это делаете:

 echo "<li>" . $node . writeList($arr) . "</li>"; 

Вся строка построена с использованием операторов конкатенации . сначала, затем распечатайте. Это означает, что writeList($arr) вызывается сначала при построении строки, then вызывается внешнее echo .

Чтобы избежать этой проблемы, не повторяйте ничего в ваших вызовах функций. Стройте строки, используя оператор конкатенации, и затем возвращайте их, чтобы ваше внешнее echo могло их распечатать.


что, если вместо того, чтобы повторять строки, я хочу сохранить строку, сгенерированную из этой функции в переменной. Меня особенно интересует результат, полученный от первого эхо-заявления.

Используйте буферизацию вывода.

 ob_start(); echo "<li>", $node, writeList($arr), "</li>"; $out = ob_get_clean(); 

Но для этого конкретного утверждения, почему бы просто не объединиться?

 $out = "<li>" . $node . writeList($arr) . "</li>"; 

echo – это языковая конструкция и может принимать несколько аргументов, разделенных запятой. Эффект идентичен конкатенированной строке.

Выход не должен отличаться – я не могу придумать экземпляр, где он может быть.

Изменить : Ах, но это так. Это потому, что ваша функция echo() es stuff. В первом случае <li> и $node получают выход; то выход функции приходит.

Я бы WriteList просто return значения рекурсивно.