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

时间:2014-06-19 21:15:11

标签: php arrays php-5.4

围绕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,没有对象或类。

5 个答案:

答案 0 :(得分:27)

我有类似的东西。

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个案例。

答案 1 :(得分:13)

我意识到这个问题很古老;但是搜索引导我到这里来。我不关心完整的迭代或使用json_decode,所以这里有一个基于preg_replace的{​​{1}} twister来完成工作。

var_export

我在几个数组和对象上测试过它。没有任何措施,但似乎工作正常。我通过压缩额外的换行符和空数组使输出“紧密”。如果您使用此方法遇到任何无意的数据损坏,请告诉我。我还没有针对上述解决方案进行基准测试,但我怀疑它会更快。喜欢阅读你的阵列!

答案 2 :(得分:9)

使用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();

答案 3 :(得分:4)

对于任何寻求更现代解决方案的人,请使用Symfony var-exporter,它也可以作为作曲家的独立库使用,但包含在Symfony默认中。

composer require symfony/var-exporter
use Symfony\Component\VarExporter\VarExporter;

// ...

echo VarExporter::export($arr)

答案 4 :(得分:2)

正如评论所指出的,这只是一种额外的语法。如果密钥或值中没有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实体。您可以使用转义序列或其他任何内容。