Конвертировать массив в код PHP - PullRequest
0 голосов
/ 14 июля 2010

После моего последнего поста о улучшенном синтаксисе для массивов я решил использовать формат JSON для массивов и использовать метод для преобразования их в код PHP.

Обратите внимание, что конечная цель этого состоит в том, чтобы написать массив $ config в JSON и перевести его в код PHP (поэтому я могу избежать необходимости использовать уродливый синтаксис PHP):

Функция отлично работает для массивов произвольного размера и размера, возможно, я мог бы улучшить ее, сделав автоматический отступ, но не намного больше. Есть ли у кого-нибудь какие-нибудь предложения по улучшению?

Ответы [ 5 ]

6 голосов
/ 14 июля 2010

Вы видели var_export? Похоже, ты это изобрел заново.

Кроме того, если вы определяете конфигурацию в JSON, почему вы превращаете ее в синтаксис PHP? Почему бы просто не прочитать его как JSON, json_decode, а затем использовать как есть? Кажется, что сохранение данных, сериализованных как в формате PHP, так и в формате JSON, действительно ужасно и не нужно.

Я бы также повторил то, что сказал Янтарь в комментариях ... кажется, что вы заменили несколько уродливый, но очень простой синтаксис PHP-массива на гораздо более уродливый хак. Без обид, но это не очень хорошая идея. Вот пример файла конфигурации из фреймворка Kohana PHP. Я не считаю этот файл особенно уродливым для чтения, и это нативный PHP, поэтому любой PHP-разработчик может с ним работать.

4 голосов
/ 14 июля 2010

Я сделаю последнее усилие, чтобы убедить вас не делать этого. Вы попросили способы улучшить свою идею, и лучшее, что вы могли бы сделать, - это не делать этого.

Вот PHP-версия файла конфигурации от Kohana:

$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 голосов
/ 14 июля 2010

var_export - ваш ответ! Делает тебя намного проще.

0 голосов
/ 18 января 2014

Вот мое решение для этого

$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, но могут быть заменены чем-то другим.

0 голосов
/ 14 июля 2010

ОК, выслушав все отзывы здесь, я решил пойти на «компромисс». Моя главная претензия к существующему синтаксису массива - его плохая читаемость, которая, безусловно, может быть значительно улучшена с помощью отступов.

Поскольку мне лень делать отступы (а файлы, которые я пишу, огромные), я выбрал JSON (или любой синтаксис, который более читабелен, чем PHP). Я не очень ясно выразился, но еще одна веская причина, почему я использую формат JSON, потому что многие другие люди будут смотреть на эти файлы конфигурации. Большинство из них не разбираются в PHP, а JSON - гораздо более понятный для человека формат.

К сожалению, средства форматирования / улучшения PHP-кода ничего не делают для форматирования массивов, поэтому я написал свой собственный. Он основан на том уродливом куске кода, который я написал выше (и он уродливее), но он выполняет свою работу.

В результате теперь у меня в основном есть beautifier для массива, и я могу генерировать читаемый нативный код 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
    )
);

Что совсем не выглядит плохо.

...