Подтвердить что ты не робот

Как форматировать var_export для синтаксиса массива php5.4

Есть много вопросов и ответов по теме действительного синтаксиса php из выходов var, я ищу быстрый и чистый способ получить вывод 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, не будет объектов или классов.

4b9b3361

Ответ 1

У меня было что-то подобное.

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.

Ответ 2

Я понимаю, что этот вопрос древний; но поиск приводит меня сюда. Мне не нравились полные итерации или использование json_decode, поэтому здесь preg_replace -based var_export twister, который выполняет задание.

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;
    }
}

Я тестировал его на нескольких массивах и объектах. Не исчерпывающе ни в какой мере, но, похоже, работает нормально. Я сделал вывод "плотным", также уплотняя дополнительные разрывы строк и пустые массивы. Если вы столкнетесь с каким-либо непреднамеренным повреждением данных, используя это, пожалуйста, дайте мне знать. Я пока не сравнивал это с вышеупомянутыми решениями, но я подозреваю, что это будет намного быстрее. Наслаждайтесь чтением своих массивов!

Ответ 3

С 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();

Ответ 4

Как отмечалось в комментариях, это просто дополнительный синтаксис. Чтобы вернуть var_export к типу скобки str_replace, хорошо работает, если в ключе или значении нет ). Это все еще просто, хотя использование JSON в качестве промежуточного:

$output = json_decode(str_replace(array('(',')'), array('&#40','&#41'), json_encode($arr)), true);
$output = var_export($output, true);
$output = str_replace(array('array (',')','&#40','&#41'), array('[',']','(',')'), $output);

Я использовал объекты HTML для ( и ). Вы можете использовать escape-последовательность или что-то еще.

Ответ 5

Для тех, кто ищет более современное решение, используйте Symfony var-exporter, также доступный в виде отдельной библиотеки на composer, но включенный по умолчанию в Symfony.

composer require symfony/var-exporter
use Symfony\Component\VarExporter\VarExporter;

// ...

echo VarExporter::export($arr)