围绕来自 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
]
]
使用正则表达式解析是普遍共识吗?如果是这样,有没有人遇到过像样的正则表达式?我将使用的数组的值级别内容都是
scalar
和array
,没有对象或类。
我周围有类似的东西。
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
的情况。
对于寻找更现代解决方案的任何人,请使用 Symfony var-exporter,它也可以作为 composer 上的独立库使用,但默认情况下包含在 Symfony 中。
composer require symfony/var-exporter
use Symfony\Component\VarExporter\VarExporter;
// ...
echo VarExporter::export($arr)
我意识到这个问题很古老;但搜索将我带到这里。我不关心完整的迭代或使用
json_decode
,所以这是一个基于 preg_replace
的 var_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;
}
}
我已经在几个数组和对象上测试过它。无论如何都不是详尽无遗的,但它似乎工作正常。我还通过压缩额外的换行符和空数组使输出“紧凑”。如果您使用它遇到任何无意的数据损坏,请告诉我。我还没有对上述解决方案进行基准测试,但我怀疑它会更快。喜欢阅读你的数组!
与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();
正如评论所指出的,这只是一个额外的语法。要使
var_export
回到方括号样式,如果键或值中没有 str_replace
,)
效果很好。虽然使用 JSON 作为中间件,但它仍然很简单:
$output = json_decode(str_replace(array('(',')'), array('(',')'), json_encode($arr)), true);
$output = var_export($output, true);
$output = str_replace(array('array (',')','(',')'), array('[',']','(',')'), $output);
我将 HTML 实体用于
(
和 )
。您可以使用转义序列或其他任何东西。