如何将var_export格式化为php5.4数组语法


How to format var_export to php5.4 array syntax

关于var输出的有效php语法主题有很多问题和答案,我正在寻找的是一种快速而干净的方式来获得var_export的输出,以使用有效的php5.4数组语法。

给定

$arr = [
    'key' => 'value',
    'mushroom' => [
        'badger' => 1
    ]
];

var_export($arr);

输出
array (
  'key' => 'value',
  'mushroom' => 
  array (
    'badger' => 1,
  ),
)

是否有任何快速和简单的方法,让它输出数组定义,使用方括号语法?

[
    'key' => 'value',
    'mushroom' => [
        'badger' => 1
    ]
]

是使用正则表达式解析的普遍共识吗?如果是这样,有没有人遇到一个像样的正则表达式?我将使用的数组的值级内容都是scalararray,没有对象或类。

我周围也有类似的东西。

function var_export54($var, $indent="") {
    switch (gettype($var)) {
        case "string":
            return '"' . addcslashes($var, "'''$'"'r'n't'v'f") . '"';
        case "array":
            $indexed = array_keys($var) === range(0, count($var) - 1);
            $r = [];
            foreach ($var as $key => $value) {
                $r[] = "$indent    "
                     . ($indexed ? "" : var_export54($key) . " => ")
                     . var_export54($value, "$indent    ");
            }
            return "['n" . implode(",'n", $r) . "'n" . $indent . "]";
        case "boolean":
            return $var ? "TRUE" : "FALSE";
        default:
            return var_export($var, TRUE);
    }
}

它不是很漂亮,但也许对你的情况来说已经足够了。

除指定类型外,其他类型均由常规var_export处理。因此,对于单引号字符串,只需注释掉string大小写。

对于寻找更现代解决方案的人,请使用Symfony var-export,它也是composer上的独立库,但默认包含在Symfony中。

composer require symfony/var-exporter
use Symfony'Component'VarExporter'VarExporter;
// ...
echo VarExporter::export($arr)

我知道这个问题很古老;但搜索把我带到了这里。我不关心完整的迭代或使用json_decode,所以这里有一个基于preg_replacevar_export扭转器,可以完成工作。

function var_export_short($data, $return=true)
{
    $dump = var_export($data, true);
    $dump = preg_replace('#(?:'A|'n)([ ]*)array '(#i', '[', $dump); // Starts
    $dump = preg_replace('#'n([ ]*)'),#', "'n$1],", $dump); // Ends
    $dump = preg_replace('#=> '['n's+'],'n#', "=> [],'n", $dump); // Empties
    if (gettype($data) == 'object') { // Deal with object states
        $dump = str_replace('__set_state(array(', '__set_state([', $dump);
        $dump = preg_replace('#')')$#', "])", $dump);
    } else { 
        $dump = preg_replace('#')$#', "]", $dump);
    }
    if ($return===true) {
        return $dump;
    } else {
        echo $dump;
    }
}

我已经在几个数组和对象上测试了它。无论以何种标准衡量,它都不是详尽的,但似乎运行得很好。我还压缩了额外的换行符和空数组,从而使输出"紧凑"。如果您遇到任何无意的数据损坏使用这个,请让我知道。我还没有对上面的解决方案进行基准测试,但我怀疑它会快得多。享受阅读数组的乐趣吧!

With https://github.com/zendframework/zend-code:

<?php
use Zend'Code'Generator'ValueGenerator;
$generator = new ValueGenerator($myArray, ValueGenerator::TYPE_ARRAY_SHORT);
$generator->setIndentation('  '); // 2 spaces
echo $generator->generate();

正如注释所指出的,这只是一个额外的语法。为了使var_export回到括号样式,如果键或值中没有), str_replace可以很好地工作。虽然使用JSON作为中介仍然很简单:

$output = json_decode(str_replace(array('(',')'), array('&#40','&#41'), json_encode($arr)), true);
$output = var_export($output, true);
$output = str_replace(array('array (',')','&#40','&#41'), array('[',']','(',')'), $output);

我使用了()的HTML实体。