我想编写一组返回缩进字符串的函数。从像table([tr([td([1,2,3]),td([4,5,6])])]);
这样的结构,我想创建一个这样的结构:
<table>
--<tr>
----<td>1</td>
----<td>2</td>
----<td>3</td>
--</tr>
--<tr>
----<td>4</td>
----<td>5</td>
----<td>6</td>
--</tr>
</table>
(我实际上并不想使用-
,而是空格,但我只是使用连字符进行开发/调试。)
这是我的剧本:
<?php
function tag($tag, $content) {
static $depth = 0;
$depth++;
echo "tag: '$tag', depth: $depth\n";
if ( is_array($content) ) {
$output = str_repeat("--", $depth);
foreach ( $content as $part ) {
$output .= tag($tag, $part);
}
$depth--;
return $output;
}
$output = str_repeat("--", $depth);
$depth--;
return "$output<$tag>$content</$tag>\n";
}
function table($content) {
return tag(__FUNCTION__, $content);
}
function tr($content) {
return tag(__FUNCTION__, $content);
}
function td($content) {
return tag(__FUNCTION__, $content);
}
echo table([tr([td([1,2,3]),td([4,5,6])])]);
这是我的输出。第一部分是调试:
tag: 'td', depth: 1
tag: 'td', depth: 2
tag: 'td', depth: 2
tag: 'td', depth: 2
tag: 'td', depth: 1
tag: 'td', depth: 2
tag: 'td', depth: 2
tag: 'td', depth: 2
tag: 'tr', depth: 1
tag: 'tr', depth: 2
tag: 'tr', depth: 2
tag: 'table', depth: 1
tag: 'table', depth: 2
以下是最终的结构:
------<table>------<tr>------<td>1</td>
----<td>2</td>
----<td>3</td>
</tr>
----<tr>------<td>4</td>
----<td>5</td>
----<td>6</td>
</tr>
</table>
我已经意识到PHP正在处理最里面的表达式,首先是td()
s,然后是tr()
s,最后是table()
,并且&# 39;为什么压痕不按我想要的方式发生。
我一直在尝试一遍又一遍地调试这段代码,而我的大脑现在正在短路。有什么方法我可以知道如何深入&#39;我在结构中,所以我可以正确缩进标签?
另外,我的换行被打破了,我不知道为什么或如何开始调试。所以,修复的奖励积分也是如此。
我意识到这不是一个实用的解决方案,并且有不同的方法可以获得我想要的输出,但是我已经走了这么远的路,现在我想了解这是如何工作的,为了它。
答案 0 :(得分:0)
当您致电A(B(), C())
时,会先评估A()
的参数,这就是执行顺序为B, C, A
的原因。当你调用td()
时,函数没有机会知道它的深度,因为它取决于执行后期添加的上下文。
我走了这么远的路,现在我想了解它是如何工作的,为了它。
不会。至少没有这样的调用echo table([tr([td([1,2,3]),td([4,5,6])])]);
- 我建议将层次结构的构建与生成实际输出分开。
或者您可以从实际使用递归开始,此时此代码永远不会执行:
if ( is_array($content) ) {
$output = str_repeat("--", $depth);
foreach ( $content as $part ) {
$output .= tag($tag, $part);
}
$depth--;
return $output;
}