что означает запятая в выражении echo? - PullRequest
3 голосов
/ 09 декабря 2010

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

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

РЕДАКТИРОВАТЬ : что если вместо вывода строк, я хочу сохранить строку, сгенерированную из этой функции, в переменной. Меня, в частности, интересует вывод, полученный из первого оператора 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>

Ответы [ 2 ]

5 голосов
/ 09 декабря 2010

РЕДАКТИРОВАТЬ: ОК, я понял.Виновником является ваша 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 мог их напечатать.


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

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

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

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

$out = "<li>" . $node . writeList($arr) . "</li>";
2 голосов
/ 09 декабря 2010

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

Вывод не должен быть другим - я не могу вспомнить случай, когда он мог бы быть.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...