关于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-export,它也是composer上的独立库,但默认包含在Symfony中。
composer require symfony/var-exporter
use Symfony'Component'VarExporter'VarExporter;
// ...
echo VarExporter::export($arr)
我知道这个问题很古老;但搜索把我带到了这里。我不关心完整的迭代或使用json_decode
,所以这里有一个基于preg_replace
的var_export
扭转器,可以完成工作。
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;
}
}
我已经在几个数组和对象上测试了它。无论以何种标准衡量,它都不是详尽的,但似乎运行得很好。我还压缩了额外的换行符和空数组,从而使输出"紧凑"。如果您遇到任何无意的数据损坏使用这个,请让我知道。我还没有对上面的解决方案进行基准测试,但我怀疑它会快得多。享受阅读数组的乐趣吧!
With 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实体。