PHP - 非递归 var_dump?

Posted

技术标签:

【中文标题】PHP - 非递归 var_dump?【英文标题】:PHP - non-recursive var_dump? 【发布时间】:2011-11-08 01:48:02 【问题描述】:

在处理某些 php 对象时,可以执行 var_dump() 并且 PHP 会不断地在屏幕上打印值,直到达到我假设的 PHP 内存限制。一个例子是转储一个简单的 html DOM 对象。我假设因为您能够遍历对象的子对象和父对象,所以执行var_dump() 会产生无限的结果,因为它会找到对象的父对象,然后递归地找到它的子对象,然后找到所有这些子对象的父对象并找到那些子对象,等等等等等等。它会一直持续下去。

我的问题是,如何避免这种情况并防止 PHP 以递归方式反复转储相同的内容?使用简单的 HTML DOM 解析器示例,如果我有一个没有子对象的 DOM 对象并且我 var_dump() 它,我希望它只是转储对象而不开始遍历 DOM 树并转储父母、祖父母和其他儿童等。

【问题讨论】:

php.net/manual/en/function.var-dump.php#99765 【参考方案1】:

在您的开发环境中安装 XDebug 扩展。它用自己的替换 var_dump,默认情况下只有 3 个成员。

https://xdebug.org/docs/display

它将显示 4 层深的项目作为省略号。您可以使用 ini 设置更改深度。

所有 PHP 函数:var_dump、var_export 和 print_r 不跟踪递归/循环引用。

编辑:

如果你想用困难的方式来做,你可以编写自己的函数

print_rr($thing, $level=0) 
   if ($level == 4)  return; 
   if (is_object($thing)) 
       $vars = get_object_vars($thing);

   

   if (is_array($thing)) 
       $vars = $thing;
   
   if (!$vars) 
       print " $thing \n";
       return;
   

   foreach ($vars as $k=>$v) 
      if (is_object($v)) return print_rr($v, $level++);
      if (is_array($v)) return print_rr($v, $level++);
      print "something like var_dump, var_export output\n";
   

【讨论】:

有没有不涉及xdebug的方法? @NicholasShanks no 除非您自己编写并跟踪深度,否则不会。【参考方案2】:

为什么不简单地在对象上运行foreach 循环?

来自PHP docs:

foreach 结构简单地提供了一种迭代数组的简单方法。 foreach 仅适用于数组(和对象),并且会发出错误 当您尝试将它用于具有不同数据类型的变量或 未初始化的变量。

【讨论】:

真的吗?当我尝试将 stdClass 发送到 foreach 时,PHP 总是给我一个通知。您可以使用的对象是否有限制? if-not-true-then-false.com/2009/… @animuson 你能贴一个例子吗?我从来没有遇到过这样的问题。 @yoda:这只是标准的“foreach 预期参数 1 为数组”或其他任何内容。我总是必须先将 stdClass 类型转换为数组,然后将其发送到 foreach 以消除通知。 好吧,既然我知道了,我会尝试在我的代码中找到我的问题所在并发布一个问题,为什么它会这样做......【参考方案3】:

我遇到了这个问题,不需要查看对象内部,只需要查看对象类名,因此我编写了一个简单的函数,在转储数据之前用它们的类名替换对象:

function sanitizeDumpContent($content)

    if (is_object($content)) return "OBJECT::".get_class($content);

    if (!is_array($content)) return $content;

    return array_map(function($node) 
        return $this->sanitizeDumpContent($node);
    , $content);

然后,当您想转储某些东西时,只需这样做:

var_dump(sanitizeDumpContent($recursive_content))

【讨论】:

以上是关于PHP - 非递归 var_dump?的主要内容,如果未能解决你的问题,请参考以下文章

PHP无限级分类实现(递归+非递归)

php 非递归实现分类树

PHP递归和非递归遍历文件夹下文件

PHP非递归遍历目录下所有文件,可以试一下!

PHP无限分类生成树方法,非递归,引用

php rmdir使用递归函数删除非空目录的方法