如何将var_导出格式化为php5.4数组语法

如何将var_导出格式化为php5.4数组语法,php,arrays,php-5.4,Php,Arrays,Php 5.4,关于var输出中的有效php语法,有很多问题和答案,我要寻找的是一种快速、干净的方法来获取var_export的输出,以使用有效的php5.4数组语法 给定 输出 array ( 'key' => 'value', 'mushroom' => array ( 'badger' => 1, ), ) 使用方括号语法,有没有快速简便的方法让它输出定义的数组 [ 'key' => 'value', 'mushroom' =>

关于var输出中的有效php语法,有很多问题和答案,我要寻找的是一种快速、干净的方法来获取
var_export
的输出,以使用有效的php5.4数组语法

给定

输出

array (
  'key' => 'value',
  'mushroom' => 
  array (
    'badger' => 1,
  ),
)
使用方括号语法,有没有快速简便的方法让它输出定义的数组

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

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

正如注释所指出的,这只是一种附加语法。如果键或值中没有
,则将
变量导出回括号样式
str\u 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实体用于
。你可以使用转义序列或任何东西。

我有类似的东西

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);
    }
}
这不太漂亮,但对你的情况来说可能足够了


除指定的类型之外的任何类型都由正则表达式处理。因此,对于单引号字符串,只需注释掉
字符串
的大小写即可。

我意识到这个问题很古老;但搜索把我带到了这里。我不喜欢完整的迭代或使用
json\u decode
,因此这里有一个基于
preg\u replace
var\u export
twister来完成任务

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;
    }
}
我已经在几个阵列和对象上进行了测试。从任何角度来看都不算详尽,但似乎效果不错。我通过压缩额外的换行符和空数组使输出“紧凑”。如果您在使用此工具时无意中遇到任何数据损坏,请告诉我。我还没有将其与上述解决方案进行基准测试,但我怀疑它会快得多。享受阅读你的阵列

带有:


对于任何寻求更现代解决方案的人,请使用Symfony var exporter,它也可以作为composer上的独立库提供,但包含在Symfony default中

编写器需要symfony/var导出器
使用Symfony\Component\VarExporter\VarExporter;
// ...
echo VarExporter::导出($arr)

你真的不能回到源代码而不使用var\u export?
array(…)
仍然是在PHP中声明数组的有效语法。方括号只不过是一种句法上的糖。哦,我明白,是的。我将其用于配置文件,如果能够返回到原始的声明语法,那就太好了。如果只是在数组中循环,然后随意打印出来怎么样?你知道中国的一句老话,“如果你不喜欢默认的
var\u导出
语法,那就自己写吧”。这似乎是一个不可靠的解决方法,因为它会在字符串上下文中替换普通的
参数。我喜欢它的简单性,可能会用它来开始,但我已经知道,正如sod定律所述,有人会将
添加到字符串中。同意。用简单的解决方案编辑。我喜欢这个。我想知道是否有任何方法可以让它只输出像
var\u export
,而不仅仅输出字符串。不是一个交易破坏者,因为这是我一直在寻找的,但这将是有趣的发现?只是
echo
自己的结果。我正要评论同样的事情,因为我在发布后意识到了这一点。非常感谢!这只是把我的数据弄得乱七八糟,在最左边的列中放了很多1。add
case'integer':case'double':return$var用于通过
var\u导出防止错误值($var,TRUE)在免责声明中。。。如果在不同的PHP版本或平台上,
var_export
输出的格式存在差异,这显然会带来一些乐趣。我找不到这方面的任何信息,所以我想没有。在PHP5.6.2和W7x64上的7.0.2上测试正常。使用嵌套数组做得很好,谢谢分享。完美答案!
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;
    }
}
<?php
use Zend\Code\Generator\ValueGenerator;
$generator = new ValueGenerator($myArray, ValueGenerator::TYPE_ARRAY_SHORT);
$generator->setIndentation('  '); // 2 spaces
echo $generator->generate();