2015-09-08 74 views
1

我想编写一组返回缩进字符串的函数。从这样table([tr([td([1,2,3]),td([4,5,6])])]);的结构,我想创建一个结构是这样的:recusive函数调用中的跟踪级别

<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()小号,最后是table(),这就是为什么缩进没有按照我想要的方式发生。

我一直试图反复调试这段代码,现在我的大脑短路了。有什么方法可以知道我在结构中有多“深”,因此我可以正确缩进标签?

此外,我的分解线断了,我不知道为什么或如何开始调试。所以,修正这个问题的奖励点也是如此。

我意识到这不是一个实际的解决方案,并有不同的方式来获得我想要的输出,但我已经走了这条路,现在我想了解它如何工作,为了的。

+0

哪里是$内容? –

+0

@raveenanigam它可以是数组的数字元素(1,2,3等),也可以是字符串“td”,“tr”或“table”。 – user151841

回答

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

你是积极的吗?我加了'echo __LINE__。 “\ n”;''并获得'''标记:'td',深度:1 标记:'td',深度:2 标记:'td',深度:2 '',15 ($ tag,$ part);' – user151841

+1

对不起,我错了,它不是*永远不会执行,但不是它的设计意义。'$ content'总是一个字符串数组,这个字符串已经被* previous()调用到'tag()',而不是一个数组数组。所以,对表元素调用两次'tag()'。 –