【问题标题】:How to format var_export to php5.4 array syntax如何将 var_export 格式化为 php5.4 数组语法
【发布时间】:2014-08-10 13:36:18
【问题描述】:

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

【问题讨论】:

  • 你真的不能回到源头不使用 var_export 吗?
  • array(...) 仍然是在 PHP 中声明数组的有效语法。方括号只不过是一种语法糖。
  • 哦,我明白了,是的。我将它用于配置文件,如果能够返回到原始声明语法,那就太好了。
  • 如何循环遍历数组并随心所欲地打印出来?
  • 你知道中国的一句老话,“如果你不喜欢默认的var_export语法,那就自己写吧”。

标签: php arrays php-5.4


【解决方案1】:

我身边也有类似的东西。

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

【讨论】:

  • 我喜欢这个。我想知道是否有任何方法可以让它像var_export 这样输出,而不仅仅是字符串。不是破坏交易,因为这是我一直在寻找的,但发现会很有趣吗?
  • 只是echo自己的结果。
  • 我正要评论同样的事情,正如我在发布后意识到的那样。非常感谢!
  • 这只是弄乱了我的数据,并在最左边的列下放了很多 1
  • 添加case 'integer': case 'double': return $var; 以防止通过var_export($var, TRUE); 出现错误值
【解决方案2】:

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

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

// ...

echo VarExporter::export($arr)

【讨论】:

  • 完美答案!
【解决方案3】:

我意识到这个问题很古老;但搜索将我带到这里。我不关心完整的迭代或使用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;
    }
}

我已经在几个数组和对象上对其进行了测试。无论如何都不是详尽无遗的,但它似乎工作正常。我还通过压缩额外的换行符和空数组使输出“紧凑”。如果您使用它遇到任何无意的数据损坏,请告诉我。我还没有根据上述解决方案对此进行基准测试,但我怀疑它会更快。享受阅读您的数组!

【讨论】:

  • 关于免责声明...如果在不同的 PHP 版本或平台上var_export 输出的格式存在差异,这显然会带来一些有趣的事情。我找不到这方面的任何信息,所以我认为没有。在 W7x64 上的 PHP 5.6.2 和 7.0.2 上测试正常。
  • 嵌套数组做得很好,谢谢分享。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    正如 cmets 所指出的,这只是一种附加语法。如果键或值中没有),则要将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 实体。您可以使用转义序列或其他任何东西。

    【讨论】:

    • 这似乎是一个不稳定的解决方法,因为它也会在字符串上下文中取代普通的 ) 括号。
    • 我喜欢它的简单性,并且可能会使用它来开始,但我已经知道,正如草皮定律所述,有人会将) 添加到他们的字符串中。
    • 同意。使用简单的解决方案进行编辑。
    猜你喜欢
    • 2015-01-04
    • 2017-04-17
    • 2013-10-23
    • 1970-01-01
    • 2017-07-30
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    相关资源
    最近更新 更多