将数组转换为PHP代码

时间:2010-07-14 18:00:22

标签: php arrays metaprogramming

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

请注意,最终目标是在JSON中编写$ config数组并将其转换为PHP代码(因此我可以避免使用PHP的丑陋数组语法):

该函数适用于任意大小和维度的数组,也许我可以通过自动缩进来改进它,但没有更多。有没有人在这里提出如何改善它的建议?

5 个答案:

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