【问题标题】:Remove formatting of var_export() php删除 var_export() php 的格式
【发布时间】:2013-10-23 13:18:13
【问题描述】:

我正在使用以下命令将数据数组打印到另存为 .php 的文件中,以便以后可以使用 include 来获取数组。

$toFile = '$Data = '. var_export($DataArray,true).'; ';
file_put_contents( $filename.'.php', "<?php ".$toFile." ?>");

它被打印到格式化为易于阅读的文件中,但由于空格和换行符等原因,它最终占用了磁盘上的更多空间。有没有一种简单的方法可以删除格式以减少占用空间。我想过使用 str_replace ,它适用于新行但不适用于空格,因为数据中可能有空格。

<?php $Data = array (
  'Info' => 
  array (
    'value1' => 'text here',
    'value2' => 'text here',
    'value3' => '$2,500 to $9,999',
  ), ....

这样的事情

<?php $Data = array('Info'=>array('value1'=>'text here','value2'=>'text here','value3'=>'$2,500 to $9,999'),...

谢谢

编辑:是否有一个 preg_replace 模式可以用来仅在引号之外删除不需要的空格?

【问题讨论】:

  • 如果可以运行 shell 命令:php -w file.php &gt; file.php
  • 我强烈建议使用像 JSON 这样的序列化数据格式,而不是创建可运行的 PHP 代码。以可运行代码的格式创建配置文件存在很大的安全隐患。
  • 之后剥离换行符并不可靠。最好写个自定义导出函数,手动示例:php.net/manual/en/function.var-export.php#54440

标签: php file formatting


【解决方案1】:

json_encode()数据可能是更好的方法。这将其压缩得非常小,甚至还有一个函数 json_decode() 可以将其转换回数组。

或者,print_r() 有第二个参数,允许您将其输出作为字符串返回。从那里你可以自己浓缩它。

使用var_dump(),您可以使用输出缓冲来实现。使用ob_start() 启动输出缓冲区,然后正常使用var_dump()。使用ob_get_clean() 获取var_dump() 的输出,然后您可以从那里开始删除所有不必要的字符。

【讨论】:

  • 或者,如果数据不打算用于 PHP 以外的其他用途,那么还有 serialize()
  • json 如果我在创建脚本之前考虑过它会是一个好主意,但我需要确保它适用于当前文件,而无需将所有旧文件转换为 json,我相信我会必须对 serialize() 做同样的事情。而 print_r() 会产生类似的格式化结果。
  • 如何在var_dump() 中使用输出缓冲。这会让你抓住输出并开始尝试将其全部压缩。请参阅我的更新答案。
  • 同意 json_encode()` 的建议。但是请注意,var_dump()print_r() 在这里不是解决方案:这些函数不打算产生稍后使用的输出;它们仅用于调试目的。无法可靠地解析输出。如果你必须这样做,那么 OP 已经在使用 var_export() 了。但是,我绝对会推荐 json_encode() 作为更强大的解决方案。
【解决方案2】:

抱歉,坏死,但如果问题仍然存在:我有同样的“问题”,我认为 JSON 不是我的答案,因为 PHP-Array 的解析效率比 JSON-对象。

所以我只写了一个小函数,它返回缩小的 PHP 输出,在我非常简单的测试用例中,它节省了大约 50% 的空间 - 更大数组的趋势应该是显着更高的百分比

<?php
function min_var_export($input) {
    if(is_array($input)) {
        $buffer = [];
        foreach($input as $key => $value)
            $buffer[] = var_export($key, true)."=>".min_var_export($value);
        return "[".implode(",",$buffer)."]";
    } else
        return var_export($input, true);
}



$testdata=["test","value","sub"=>["another","array" => ["meep"]]];
$d1 = var_export($testdata, true);
$d2 = min_var_export($testdata);
echo "$d2\n===\n$d1\n\n";
printf("length old: %d\nlength new: %d\npercent saved: %5.2f\n", strlen($d1),strlen($d2), (1-(strlen($d2)/strlen($d1)))*100);

【讨论】:

  • 为了完整起见,你应该阅读这个答案,解释为什么你需要文件锁定而不使用flock(),以及为什么你可以在包含的文件中使用returnstackoverflow.com/a/7927642/318765
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多