2010-12-08 38 views
2

我想呼應,從一個遞歸函數的字符串:
echo "<li>", $node, recurse($arr), "</li>";

echo "<li>" . $node . recurse($arr) . "</li>";echo語句中的逗號意味着什麼?

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

$tree是一個樹狀結構,可以在this question(窗口2)找到

而且,我可以注意到兩者的輸出是不同的。
有人可以告訴我一般使用,.的區別,特別是在這個例子中?

編輯:如果不是回顯字符串,我想將此函數生成的字符串存儲在變量中。我特別感興趣的是從第一份echo聲明中收到的結果。

編輯: 我饋送此數組:

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> 
+0

它們有什麼不同?在回顯出來之前,所有東西都會被視爲字符串... – BoltClock 2010-12-08 23:34:22

+0

我提供了我正在使用的函數,輸入數組和輸出數據。只要告訴我,這不是我的錯誤,而是一個概念問題。 :) – Stoic 2010-12-08 23:50:32

回答

5

編輯:好的,我明白了。罪魁禍首是你的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>"; 
2

echo是一種語言結構,可以接受用逗號分隔的多個參數。效果與連接字符串相同。

輸出不應該是不同的 - 我想不出一個可能的例子。

編輯:啊,但它是。這是因爲你的功能echo() es東西。首先,<li>$node得到輸出; 然後函數的輸出。

我會有WriteList簡單return值遞歸。

+2

我在想這樣的功能調用產生什麼樣的輸出,但沒有骰子。該函數內部的`echo`不會返回任何可能被外部回聲意外回顯的東西。 – BoltClock 2010-12-08 23:39:54