Как форматировать 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 , а не объектами или классами.

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

 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 регистр.

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

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

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

Как отмечали комментарии, это просто дополнительный синтаксис. Чтобы вернуть 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-последовательность или что угодно.

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