首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将var_export格式化为php5.4数组语法

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

Stack Overflow用户
提问于 2014-06-19 21:15:11
回答 5查看 11.9K关注 0票数 31

关于var输出的有效php语法,有很多问题和答案,我想要的是一种让var_export的输出使用有效php5.4数组语法的快速而干净的方法。

给定的

代码语言:javascript
运行
复制
$arr = [
    'key' => 'value',
    'mushroom' => [
        'badger' => 1
    ]
];


var_export($arr);

输出

代码语言:javascript
运行
复制
array (
  'key' => 'value',
  'mushroom' => 
  array (
    'badger' => 1,
  ),
)

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

代码语言:javascript
运行
复制
[
    'key' => 'value',
    'mushroom' => [
        'badger' => 1
    ]
]

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-06-19 21:41:02

我也有过类似的事情。

代码语言:javascript
运行
复制
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的情况。

票数 37
EN

Stack Overflow用户

发布于 2019-09-10 13:31:28

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

代码语言:javascript
运行
复制
composer require symfony/var-exporter
代码语言:javascript
运行
复制
use Symfony\Component\VarExporter\VarExporter;

// ...

echo VarExporter::export($arr)
票数 17
EN

Stack Overflow用户

发布于 2016-02-04 17:05:51

我意识到这个问题是古老的,但是搜索引导我来到这里。我不关心完整的迭代或使用json_decode,所以这里有一个preg_replace-based var_export扭曲器来完成工作。

代码语言:javascript
运行
复制
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;
    }
}

我已经在几个数组和对象上测试过它。从任何角度来说都不是穷尽的,但它似乎运转得很好。我还通过压缩额外的换行和空数组使输出“紧密”。如果您在使用此程序时遇到任何意外的数据损坏,请告诉我。我还没有将其与上述解决方案进行对比,但我怀疑它会快得多。好好读你的数组吧!

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24316347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档