在我关于better syntax for arrays的上一篇文章之后,我决定对数组使用JSON格式并使用方法将它们转换为PHP代码。
请注意,最终目标是在JSON中编写$ config数组并将其转换为PHP代码(因此我可以避免使用PHP的丑陋数组语法):
该函数适用于任意大小和维度的数组,也许我可以通过自动缩进来改进它,但没有更多。有没有人在这里提出如何改善它的建议?
答案 0 :(得分:6)
你见过var_export
吗?看起来你已经彻底改造了它。
另外,如果您使用JSON定义配置,为什么要将其转换为PHP语法?为什么不直接将其作为JSON,json_decode
读取,然后按原样使用它?看起来像是以PHP格式维护数据序列化,而JSON格式真的很丑陋且不必要。
我也会回应amber在评论中所说的内容......似乎你已经用一个更丑陋的hack取代了有点丑陋但非常简单的PHP数组语法。没有冒犯,但这似乎不是一个好主意。来自Kohana PHP框架的配置文件的Here's an example。我没有发现这个文件特别难看,而且它是原生PHP,所以任何PHP开发人员都可以使用它。
答案 1 :(得分:4)
我将尽最后努力说服你不要这样做。你想方设法改进你的想法,你可以做的最好的改进就是不去做。
以下是Kohana的配置文件的PHP版本:
$test = array(
'default' => array(
'type' => 'mysql',
'connection' => array(
'hostname' => 'localhost',
'database' => 'kohana',
'username' => FALSE,
'password' => FALSE,
'persistent' => FALSE,
),
'table_prefix' => '',
'charset' => 'utf8',
'caching' => FALSE,
'profiling' => TRUE,
),
'alternate' => array(
'type' => 'pdo',
'connection' => array(
'dsn' => 'mysql:host=localhost;dbname=kohana',
'username' => 'root',
'password' => 'r00tdb',
'persistent' => FALSE,
),
'table_prefix' => '',
'charset' => 'utf8',
'caching' => FALSE,
'profiling' => TRUE,
),
);
这是JSON版本:
var test = {
"default": {
"type": "mysql",
"connection": {
"hostname": "localhost",
"database": "kohana",
"username": false,
"password": false,
"persistent": false
},
"table_prefix": "",
"charset": "utf8",
"caching": false,
"profiling": true
},
"alternate": {
"type": "pdo",
"connection": {
"dsn": "mysql:host=localhost;dbname=kohana",
"username": "root",
"password": "r00tdb",
"persistent": false
},
"table_prefix": "",
"charset": "utf8",
"caching": false,
"profiling": true
}
};
它们几乎相同。我真的没有看到你正在获得什么。
答案 2 :(得分:2)
var_export是你的答案!让你变得更轻松。
答案 3 :(得分:0)
好的,在听到所有人的反馈后,我决定做出“妥协”。使用现有数组语法的主要优点是可读性差,使用缩进肯定可以改进(很多)。
因为我懒得缩进(我写的文件很大),我选择了JSON(或任何比PHP更可读的语法)。我没有说清楚,但是我使用JSON格式的另一个有力的原因是因为许多其他人会查看这些配置文件。他们中的大多数都不懂PHP,JSON是一种更易于阅读的格式。
不幸的是,PHP代码格式化器/美化器没有对数组格式做任何事情,所以我编写了自己的代码。它是基于我上面写的那段丑陋的代码(而且它更加丑陋),但它确实起到了作用。
结果现在我基本上有一个数组美化器,我可以生成可读的本机PHP代码,同时是懒惰的。这就是我想要的,感谢大家的建议和指示。
PS:这是我用我的函数生成的美化Kohana配置数组:
array (
'default' => array (
'type' => 'mysql',
'connection' => array (
'hostname' => 'localhost',
'database' => 'kohana',
'username' => false,
'password' => false,
'persistent' => false
),
'table_prefix' => '',
'charset' => 'utf8',
'caching' => false,
'profiling' => true
),
'alternate' => array (
'type' => 'pdo',
'connection' => array (
'dsn' => 'mysql:host=localhost;dbname=kohana',
'username' => 'root',
'password' => 'r00tdb',
'persistent' => false
),
'table_prefix' => '',
'charset' => 'utf8',
'caching' => false,
'profiling' => true
)
);
这看起来并不坏。
答案 4 :(得分:0)
这是我的解决方案
$data = json_decode(file_get_contents(__DIR__ . '/data.json'));
$code = var_export((array)$data, true);
$code = "<?php\n return " . preg_replace('/stdClass::__set_state/', '(object)', $code) . ';';
file_put_contents(__DIR__ . '/data.array.php', $code);
数据来自JSON文件,但可以替换为其他内容。