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

<p>у меня есть массив:</p><pre><code>$a = array('foo' => 'foome'); и я делаю:print_r($a); </code></pre><p>который печатает:</p><pre><code>array ( [foo] => printme ) </code></pre><p>есть ли функция, поэтому при выполнении:</p><pre><code>needed\_function(' array ( [foo] => printme )'); </code></pre><p>я верну массив <code>array('foo' => 'foome');</code> обратно?</p>

<p>я на самом деле написал функцию, которая анализирует «строковый массив» в фактический массив. очевидно, что это несколько странно, но это работает на моем тестовом примере. вот ссылка на работающий прототип на <a href="http://codepad.org/idlxdij3">http://codepad.org/idlxdij3</a> .</p><p>я также выложу код для тех людей, которые не хотят нажимать на ссылку:</p><pre><code><?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; } } ?> </code></pre>

<p>если вы хотите сохранить массив как строку, используйте <a href="http://php.net/manual/en/function.serialize.php"><code>serialize</code> <em><sup>[docs]</sup> </em></a> и <a href="http://php.net/manual/en/function.unserialize.php"><code>unserialize</code> <em><sup>[docs]</sup> </em></a> .</p><p>чтобы ответить на ваш вопрос: нет, нет встроенной функции для повторного анализа вывода <code>print\_r</code> в массив.</p>

<p>нет. но вы можете использовать функции <code>serialize</code> и <code>json\_*</code>.</p><pre><code>$a = array('foo' => 'foome'); echo serialize($a); $a = unserialize($input); </code></pre><p>или же:</p><pre><code>echo json\_encode($a); $a = json\_decode($input, true); 

для вывода массива с subarrays решение, предоставленное <a href="https://stackoverflow.com/a/7026674/3653989">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; } ?> </code></pre><p>есть одна маленькая ошибка, если у вас есть пустое значение (пустая строка), оно вставляется в значение раньше.</p>

<p>вы не можете сделать это с <code>print\_r</code>,<br> <code>var\_export</code> должен позволять что-то похожее, но не совсем то, что вы просили</p><p> <a href="http://php.net/manual/en/function.var-export.php">http://php.net/manual/en/function.var-export.php</a> </p><pre><code>$val = var_export($a, true); print\_r($val); eval('$func\_val='.$val.';'); 

существует хороший онлайн-инструмент, который точно так и называется. <a href="https://www.nestforms.com/php-print_r-to-json-online">конвертер print_r в json от объекта json не далеко до создания массива с функцией <a href="http://php.net/json_decode">json_decode :чтобы получить массив из этого, установите для второго параметра значение true. если вы этого не сделаете, вы получите объект вместо этого.json_decode($jsondata, true); </code></pre>

<p>использовать var\_export (array ('sample array', array ('apple', 'orange')));</p><p>вывод: массив ( 0 => 'образец массива', 1 => массив ( 0 => 'apple', 1 => 'orange' , ), )</p>

<p>быстрая функция (без проверки, если вы отправляете хорошие данные):</p><pre><code>function texttoarray($str) { $output = []; foreach (explode("\n", $str) as $line) { if (trim($line) == "array" or trim($line) == "(" or trim($line) == ")") { continue; } preg_match("/[(.)] => (.)$/i", $line, $match); $output[$match[1]] = $match[2]; } return $output; } </code></pre><p>это ожидаемый вклад:</p><pre><code>array ( [test] => 6 ) </code></pre>

<p>я думаю, что моя функция тоже классная, работает с вложенными массивами:</p><pre><code>function print\_r\_reverse($input) { $output = str\_replace(['[', ']'], ["'", "'"], $input); $output = preg\_replace('/=> (?!array)(.*)$/m', "=> '$1',", $output); $output = preg\_replace('/^\s+\)$/m', "),n", $output); $output = rtrim($output, "\n,"); return eval("return $output;"); } </code></pre><p><em> nb: лучше не использовать это с пользовательскими данными ввода </em> </p>