Я пытаюсь повторить строку из функции Рекурсивная:
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
значения рекурсивно.