如何以有序的方式转储数组


How do I dump arrays in a nice orderly fashion?

每当我使用print_rvar_dump它们都会草率地出现在一行中,而不是像我看到这么多人和实际 php.net 网站能够实现的那样格式化。我该怎么做才能让他们变成这样——

Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
        )
)

取而代之的是这个

Array([a] => apple [b] => banana [c] => Array ( [0] => x [1] => y [2] => z ))

(很确定它比我只是手动删除空格更混乱。

只需将您的转储包装在<pre>标签中:

<pre><?php print_r($array); ?></pre>

此外,如果您查看页面的源代码,它也将像这样。只是因为 HTML 忽略了空格,所以您可以在浏览器中的一行中看到所有空格。

如果你真的想要一个简单的函数,保持数组漂亮,可以接受无限的参数,并且不需要完整的库,试试我下面的片段。它将打印从数组到pre标记中的xml对象的所有内容,标题提供参数类型和可能的对象类的信息。

function preDump() {    //  use string "noEcho" to just get a string return only
    $args = func_get_args();
    $doEcho = TRUE; $sb;
    if ($args) {
        $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;padding:0em 3em 1em 1em;"><legend><b>preDump: '.count($args).' Parameters Found.</b></legend>';
        foreach (func_get_args() as $arg) {
            if (gettype($arg) == 'string') if ($arg == 'noEcho') { $doEcho = FALSE; $sb = preg_replace('/(preDump: )[0-9]+/', 'preDump: '.(count($args)-1), $sb); continue; }
            $sb .= '<pre data-type="'.gettype($arg).'"';
            switch (gettype($arg)) {
                case "boolean":
                case "integer":
                    $sb .= ' data-dump="json_encode"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>';
                    $sb .= json_encode($arg);
                    break;
                case "string":
                    $sb .= ' data-dump="echo"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>';
                    $sb .= $arg;
                    break;
                default:
                    $sb .= ' data-dump="var_dump"';
                    if (is_object($arg)) $sb .= 'data-class="'.get_class($arg).'"';
                    $sb .= '><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')';
                    if (is_object($arg)) $sb .= ' ['.get_class($arg).']';
                    $sb .= '</b></p><p>';
                    ob_start();
                    var_dump($arg);
                    $sb .= ob_get_clean();
                    if (ob_get_length()) ob_end_clean();
            }
            $sb .= '</p></pre>';
        }
        $sb .= '</fieldset></div>';
    }
    else {
        $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;"><legend><b>preDump: [ERROR]</b></legend><h3>No Parameters Found</h3></fieldset></div>';
    }
    if ($doEcho) echo($sb);
    return $sb;
}

使用起来非常简单:

preDump($array1, $array2, $array3, $array4, $array5);
preDump('string', TRUE, 101, array( 'test', 'array' ), (object)array('object'=>'array'), $xmlVariable);

甚至可以通过将字符串noEcho作为参数传递来仅返回字符串(不打印到浏览器)。

$bob = preDump($array1, $array2, 'noEcho');