将数组转换为PHP代码

将数组转换为PHP代码,php,arrays,metaprogramming,Php,Arrays,Metaprogramming,在上一篇关于的文章之后,我决定对数组使用JSON格式,并使用一种方法将它们转换为PHP代码 请注意,本文的最终目标是用JSON编写$config数组,并将其转换为PHP代码,这样我就可以避免使用PHP难看的数组语法: 该函数适用于任意大小和尺寸的数组,也许我可以通过让它自动缩进来改进它,但没有更多。这里有人对如何做得更好有什么建议吗?你看到了吗?看起来你已经重新发明了它 另外,如果您使用JSON定义配置,为什么要将其转换为PHP语法?为什么不把它作为JSON读入,JSON_解码,然后按原样使用呢

在上一篇关于的文章之后,我决定对数组使用JSON格式,并使用一种方法将它们转换为PHP代码

请注意,本文的最终目标是用JSON编写$config数组,并将其转换为PHP代码,这样我就可以避免使用PHP难看的数组语法:

该函数适用于任意大小和尺寸的数组,也许我可以通过让它自动缩进来改进它,但没有更多。这里有人对如何做得更好有什么建议吗?

你看到了吗?看起来你已经重新发明了它

另外,如果您使用JSON定义配置,为什么要将其转换为PHP语法?为什么不把它作为JSON读入,JSON_解码,然后按原样使用呢?看起来,以PHP格式和JSON格式对数据进行序列化是非常难看和不必要的


我也会回应amber在评论中说的话。。。看起来你已经用一个更难看的黑客取代了有点难看但非常简单的PHP数组语法。无意冒犯,但这似乎不是个好主意。来自Kohana PHP框架的配置文件。我不觉得这个文件读起来特别难看,它是原生PHP,所以任何PHP开发人员都可以使用它。

var\u export是您的答案!让你的工作更轻松。

我会做最后一次努力说服你不要这样做。你要求改进你的想法,你能做的最好的改进就是不去做

以下是来自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
    }
};

他们几乎一模一样。我真的看不出你得到了什么。

好的,在听取了这里所有人的反馈之后,我决定做出妥协。我对现有数组语法的主要不满是它的可读性差,使用缩进当然可以大大提高可读性

因为我懒于缩进,而且我编写的文件很大,所以我选择了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
    )
);

这看起来一点也不糟糕。

这是我的解决方案

$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文件,但可以替换为其他内容。

这似乎用一段设计用来绕过它的代码来取代PHP数组语法的丑陋。事实上,但最终目标是简化配置数组的编写,如果用PHP编写,它可能会变得非常混乱。这段代码会运行几次,但会让我的生活和其他代码的维护变得更容易。。。为什么不使用json_编码呢?看看你的代码是否会被其他人维护这是个坏主意。作为昨天这个json_解码解决方案的作者,我不得不说这有点疯狂。没有任何方法比语言提供的创建数组的标准方法更容易维护,因为这是在PHP101中学习的第一件事。数组并没有那么难看,你现在花了更多的时间来创建一个解决方案,以避免不得不写“array”一词,而不是你只需要咬紧牙关手工创建数组。var_export缺少$cleanKeys功能,即:生成array1,2而不是array0=>1, 1 => 2@Aircule这很重要吗?不是很重要,但会让事情变得更加混乱。艾库勒,这些事情其实是一样的。您应该像我发布的示例一样格式化您的数组,以使其可读。这会让它感觉不那么凌乱。@Aircule-另外,您的代码似乎容易受到SQL注入之类的代码注入的攻击,但对于PHP,因为您不会转义字符串。您可以使用$s=var\u export$x,如果是真的,则使用您的\u parse\u beuty$s仅用于美化空格和行。