我试图从递归函数回显一个字符串:
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>";
}
Run Code Online (Sandbox Code Playgroud)
$tree是一个树状结构,可以在这个问题中找到(form2)
而且,我可以注意到两者的输出是不同的.
有人可以告诉我使用,和.一般情况的区别,特别是在这个例子中?
编辑:如果不是回显字符串,我想将此函数生成的字符串存储在变量中.我特别感兴趣的是从第echo一份声明收到的输出.
编辑:我正在喂这个数组:
array
3 =>
array
4 =>
array
7 => null
8 =>
array
9 => null
5 => null
6 => null
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:(
来自第一个回声声明)
<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>
Run Code Online (Sandbox Code Playgroud)
(来自第二个回声声明)
<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>
Run Code Online (Sandbox Code Playgroud)
编辑:好的,我明白了.罪魁祸首是你的writeList()功能.echo该功能内部有一个辅助功能.
当你这样做:
echo "<li>", $node, writeList($arr), "</li>";
Run Code Online (Sandbox Code Playgroud)
首先评估每个部件然后打印出来.它相当于:
echo "<li>";
echo $node;
echo writeList($arr);
echo "</li>";
Run Code Online (Sandbox Code Playgroud)
但是当你这样做时:
echo "<li>" . $node . writeList($arr) . "</li>";
Run Code Online (Sandbox Code Playgroud)
整个字符串首先使用连接运算符构造.,然后打印出来.这意味着writeList($arr)在构造字符串时首先调用,then外部echo调用.
要避免此问题,请不要在函数调用中回显任何内容.使用连接运算符构建字符串,然后返回它们,以便外部echo可以打印它们.
如果不是回显字符串,我想将此函数生成的字符串存储在变量中.我特别感兴趣的是从第一个echo语句收到的输出.
使用输出缓冲.
ob_start();
echo "<li>", $node, writeList($arr), "</li>";
$out = ob_get_clean();
Run Code Online (Sandbox Code Playgroud)
但对于那个特定的陈述,为什么不直接连接呢?
$out = "<li>" . $node . writeList($arr) . "</li>";
Run Code Online (Sandbox Code Playgroud)