Как создать массив из вывода массива, напечатанного с помощью print_r?

У меня есть массив:

$a = array('foo' => 'fooMe'); 

и я делаю:

 print_r($a); 

который печатает:

 Array ( [foo] => printme ) 

Есть ли функция, поэтому при выполнении:

 needed_function(' Array ( [foo] => printme )'); 

Я получу массив array('foo' => 'fooMe'); назад?

Solutions Collecting From Web of "Как создать массив из вывода массива, напечатанного с помощью print_r?"

Я на самом деле написал функцию, которая анализирует «строковый массив» в реальном массиве. Очевидно, что это немного взломанно и много, но работает на моей тестовой площадке. Вот ссылка на действующий прототип на http://codepad.org/idlXdij3 .

Я отправлю также встроенный код для тех людей, которые не хотят нажимать на ссылку:

 <?php /** * @author ninetwozero */ ?> <?php //The array we begin with $start_array = array('foo' => 'bar', 'bar' => 'foo', 'foobar' => 'barfoo'); //Convert the array to a string $array_string = print_r($start_array, true); //Get the new array $end_array = text_to_array($array_string); //Output the array! print_r($end_array); function text_to_array($str) { //Initialize arrays $keys = array(); $values = array(); $output = array(); //Is it an array? if( substr($str, 0, 5) == 'Array' ) { //Let's parse it (hopefully it won't clash) $array_contents = substr($str, 7, -2); $array_contents = str_replace(array('[', ']', '=>'), array('#!#', '#?#', ''), $array_contents); $array_fields = explode("#!#", $array_contents); //For each array-field, we need to explode on the delimiters I've set and make it look funny. for($i = 0; $i < count($array_fields); $i++ ) { //First run is glitched, so let's pass on that one. if( $i != 0 ) { $bits = explode('#?#', $array_fields[$i]); if( $bits[0] != '' ) $output[$bits[0]] = $bits[1]; } } //Return the output. return $output; } else { //Duh, not an array. echo 'The given parameter is not an array.'; return null; } } ?> 

Если вы хотите сохранить массив как строку, используйте serialize [docs] и unserialize [docs] .

Чтобы ответить на ваш вопрос: Нет, нет встроенной функции для синтаксического анализа вывода print_r в массив.

Нет. Но вы можете использовать функции serialize и json_* .

 $a = array('foo' => 'fooMe'); echo serialize($a); $a = unserialize($input); 

Или:

 echo json_encode($a); $a = json_decode($input, true); 

Для вывода массива с Subarrays решение, предоставляемое ninetwozero , не будет работать, вы можете попробовать с помощью этой функции, которая работает со сложными массивами:

 <?php $array_string = " Array ( [0] => Array ( [0] => STATIONONE [1] => 02/22/15 04:00:00 PM [2] => SW [3] => Array ( [0] => 4.51 ) [4] => MPH [5] => Array ( [0] => 16.1 ) [6] => MPH ) [1] => Array ( [0] => STATIONONE [1] => 02/22/15 05:00:00 PM [2] => S [3] => Array ( [0] => 2.7 ) [4] => MPH [5] => Array ( [0] => 9.61 ) [6] => MPH ) ) "; print_r(print_r_reverse(trim($array_string))); function print_r_reverse(&$output) { $expecting = 0; // 0=nothing in particular, 1=array open paren '(', 2=array element or close paren ')' $lines = explode("\n", $output); $result = null; $topArray = null; $arrayStack = array(); $matches = null; while (!empty($lines) && $result === null) { $line = array_shift($lines); $trim = trim($line); if ($trim == 'Array') { if ($expecting == 0) { $topArray = array(); $expecting = 1; } else { trigger_error("Unknown array."); } } else if ($expecting == 1 && $trim == '(') { $expecting = 2; } else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\> (.+)$/', $trim, $matches)) // array element { list ($fullMatch, $key, $element) = $matches; if (trim($element) == 'Array') { $topArray[$key] = array(); $newTopArray =& $topArray[$key]; $arrayStack[] =& $topArray; $topArray =& $newTopArray; $expecting = 1; } else { $topArray[$key] = $element; } } else if ($expecting == 2 && $trim == ')') // end current array { if (empty($arrayStack)) { $result = $topArray; } else // pop into parent array { // safe array pop $keys = array_keys($arrayStack); $lastKey = array_pop($keys); $temp =& $arrayStack[$lastKey]; unset($arrayStack[$lastKey]); $topArray =& $temp; } } // Added this to allow for multi line strings. else if (!empty($trim) && $expecting == 2) { // Expecting close parent or element, but got just a string $topArray[$key] .= "\n".$line; } else if (!empty($trim)) { $result = $line; } } $output = implode("\n", $lines); return $result; } /** * @param string $output : The output of a multiple print_r calls, separated by newlines * @return mixed[] : parseable elements of $output */ function print_r_reverse_multiple($output) { $result = array(); while (($reverse = print_r_reverse($output)) !== NULL) { $result[] = $reverse; } return $result; } ?> с <?php $array_string = " Array ( [0] => Array ( [0] => STATIONONE [1] => 02/22/15 04:00:00 PM [2] => SW [3] => Array ( [0] => 4.51 ) [4] => MPH [5] => Array ( [0] => 16.1 ) [6] => MPH ) [1] => Array ( [0] => STATIONONE [1] => 02/22/15 05:00:00 PM [2] => S [3] => Array ( [0] => 2.7 ) [4] => MPH [5] => Array ( [0] => 9.61 ) [6] => MPH ) ) "; print_r(print_r_reverse(trim($array_string))); function print_r_reverse(&$output) { $expecting = 0; // 0=nothing in particular, 1=array open paren '(', 2=array element or close paren ')' $lines = explode("\n", $output); $result = null; $topArray = null; $arrayStack = array(); $matches = null; while (!empty($lines) && $result === null) { $line = array_shift($lines); $trim = trim($line); if ($trim == 'Array') { if ($expecting == 0) { $topArray = array(); $expecting = 1; } else { trigger_error("Unknown array."); } } else if ($expecting == 1 && $trim == '(') { $expecting = 2; } else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\> (.+)$/', $trim, $matches)) // array element { list ($fullMatch, $key, $element) = $matches; if (trim($element) == 'Array') { $topArray[$key] = array(); $newTopArray =& $topArray[$key]; $arrayStack[] =& $topArray; $topArray =& $newTopArray; $expecting = 1; } else { $topArray[$key] = $element; } } else if ($expecting == 2 && $trim == ')') // end current array { if (empty($arrayStack)) { $result = $topArray; } else // pop into parent array { // safe array pop $keys = array_keys($arrayStack); $lastKey = array_pop($keys); $temp =& $arrayStack[$lastKey]; unset($arrayStack[$lastKey]); $topArray =& $temp; } } // Added this to allow for multi line strings. else if (!empty($trim) && $expecting == 2) { // Expecting close parent or element, but got just a string $topArray[$key] .= "\n".$line; } else if (!empty($trim)) { $result = $line; } } $output = implode("\n", $lines); return $result; } /** * @param string $output : The output of a multiple print_r calls, separated by newlines * @return mixed[] : parseable elements of $output */ function print_r_reverse_multiple($output) { $result = array(); while (($reverse = print_r_reverse($output)) !== NULL) { $result[] = $reverse; } return $result; } ?> 

Существует одна крошечная ошибка, если у вас есть пустое значение (пустая строка), она вставляется в значение раньше.

вы не можете сделать это с помощью print_r ,
var_export должен позволить что-то подобное, но не совсем то, что вы просили

http://php.net/manual/en/function.var-export.php

 $val = var_export($a, true); print_r($val); eval('$func_val='.$val.';'); 

Существует онлайн-инструмент, который может помочь http://www.printr-reverse.org/

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