追踪函数调用中的跟踪级别

时间:2015-09-08 06:14:54

标签: php recursion

我想编写一组返回缩进字符串的函数。从像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;我在结构中,所以我可以正确缩进标签?

另外,我的换行被打破了,我不知道为什么或如何开始调试。所以,修复的奖励积分也是如此。

我意识到这不是一个实用的解决方案,并且有不同的方法可以获得我想要的输出,但是我已经走了这么远的路,现在我想了解这是如何工作的,为了它。

1 个答案:

答案 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;
  }