PHP 的替代 var_dump 允许限制嵌套数组的深度

Posted

技术标签:

【中文标题】PHP 的替代 var_dump 允许限制嵌套数组的深度【英文标题】:Alternative var_dump for PHP that allows limiting depth of nested arrays 【发布时间】:2012-11-03 23:13:15 【问题描述】:

我尝试在 phpsh 的命令行上使用 var_dump 来获取有关某些变量的调试信息。但是该变量包含一个非常嵌套的数据结构。因此,使用默认的 var_dump 会输出太多信息。

我想限制 var_dump 输出的深度级别。我发现 XDebug 的 var_dump 实现允许深度限制,如下所述:http://www.giorgiosironi.com/2009/07/how-to-stop-getting-megabytes-of-text.html

不幸的是,我也无法完成这项工作。我还不知道这是什么原因。我正在寻找是否有任何替代的 var_dump 实现可以尝试。

【问题讨论】:

你试过print_r吗?它保留的信息更少 您是否对适当的 php.ini 文件进行了更改? php.ini 用于 CLI 配置(即 /etc/php5/cli/php.ini),另一个用于 Apache 配置(即 /etc/php5/apache/php.ini)。 xDebug 解决方案确实有效,而且效果很好。你尝试了什么?这是您问题的最佳答案。 @IgorPopov 是的,我试过print_r。它也打印整个对象图。 @ivankoni 是的,我安装了 xdebug 并在适当的 php.ini 文件中进行了更改。我使用网络派服务器。我更改了 ~/webapps//php.ini 文件。我添加了xdebug.var_display_max_depth=1 你也可以使用json_encode。回声@json_encode($var);它只会打印变量的可读值 【参考方案1】:

json_encode 采用深度参数。 这样做:

echo '<pre>' . json_encode($your_array, JSON_PRETTY_PRINT, $depth) . '</pre>';

【讨论】:

这似乎是一个不错的解决方案,但它剥离了太多信息,例如对象名称。因此,不幸的是,它不是很有用。【参考方案2】:

这里是这个问题的函数:

function slice_array_depth($array, $depth = 0) 
    foreach ($array as $key => $value) 
        if (is_array($value)) 
            if ($depth > 0) 
                $array[$key] = slice_array_depth($value, $depth - 1);
             else 
                unset($array[$key]);
            
        
    

    return $array;

使用此函数将数组切片到您需要的深度,而不仅仅是 var_dump()print_r() 切片数组:)

【讨论】:

我认为他要问的是数组值是数组本身,他想打印它们,以便在一定深度后打印下一个元素。 print_r 将打印数组的所有深度 $depth=0$value 是一个数组时会发生什么?我认为它仍然是一个数组并且没有被切断。您将需要一个elseif,其中必须有$array[$key]='Array at max deth'; 你应该传递一个多维数组和你想要切片的深度 刚刚检查过,您的函数不会对数组进行任何更改。那是因为当$depth 达到0 并且$value 原来是一个数组时,您实际上并没有将它切掉,它只是保持不变。 我们需要将 $depth-1 传递给函数而不是在当前范围内将 $depth 减 1 应该是$array[$key] = slice_array_depth($value, $depth-1);【参考方案3】:

检查一下:

function print_array($array,$depth=1,$indentation=0)
    if (is_array($array))
                    echo "Array(\n";
        foreach ($array as $key=>$value)
            if(is_array($value))
                if($depth <= 0)
                    echo "max depth reached.";
                
                else
                    for($i=0;$i<$indentation;$i++)
                        echo "&nbsp;&nbsp;&nbsp;&nbsp;";
                    
                    echo $key."=Array(";
                    print_array($value,$depth-1,$indentation+1);
                    for($i=0;$i<$indentation;$i++)
                        echo "&nbsp;&nbsp;&nbsp;&nbsp;";
                    
                    echo ");";
                
            
            else
                for($i=0;$i<$indentation;$i++)
                    echo "&nbsp;&nbsp;&nbsp;&nbsp;";
                
                echo $key."=>".$value."\n";
            
        
                    echo ");\n";
    
    else
        echo "It is not an array\n";
    

【讨论】:

谢谢,这解决了我的问题。上面的代码中有一些语法错误。更正后,该功能将按要求工作。

以上是关于PHP 的替代 var_dump 允许限制嵌套数组的深度的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中更漂亮/信息更丰富的 Var_dump 替代方案? [关闭]

php var_dump输出格式化数组。

php底层源码之数组

PHP - 非递归 var_dump?

PHP 重新格式化var_dump/print_r打印的数组

php var_dump() 与 print_r()