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

mu0hgdu0  于 2023-02-21  发布在  PHP
关注(0)|答案(5)|浏览(156)

有很多问题和答案围绕着从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,没有对象或类。

m1m5dgzv

m1m5dgzv1#

我周围也有类似的东西。

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的大小写。

wwwo4jvm

wwwo4jvm2#

对于任何寻找更现代的解决方案的人,请使用Symfony var-exporter,它也可以作为composer上的独立库提供,但默认情况下包含在Symfony中。

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

// ...

echo VarExporter::export($arr)
yk9xbfzb

yk9xbfzb3#

我知道这个问题由来已久但是搜索把我带到了这里,我不关心完整的迭代或使用json_decode,所以这里有一个基于preg_replacevar_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;
    }
}

我已经在几个数组和对象上测试过了。从任何Angular 来看都不是详尽的,但是它看起来工作得很好。我通过压缩额外的换行符和空数组使输出“紧凑”。如果你在使用它的时候遇到了任何意外的数据损坏,请告诉我。我还没有对上面的解决方案进行基准测试,但是我怀疑它会快得多。享受阅读你的数组吧!

rxztt3cl

rxztt3cl4#

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

pkwftd7m5#

正如评论所指出的,这只是一个附加语法,如果键或值中没有),那么var_export就可以很好地将var_export恢复为括号样式,尽管使用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实体来表示(),你可以使用转义序列或者别的什么。

相关问题