Wie erstelle ich ein Array aus der Ausgabe eines mit print_r gedruckten Arrays?

Ich habe ein Array:

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

und ich mache:

 print_r($a); 

welches druckt:

 Array ( [foo] => printme ) 

Gibt es eine function?

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

Ich bekomme das Array- array('foo' => 'fooMe'); zurück?

Ich habe tatsächlich eine function geschrieben, die ein “stringed array” in ein Array analysiert. Offensichtlich ist es etwas hacky und was nicht, aber es funktioniert auf meinem Testfall. Hier ist ein Link zu einem funktionierenden Prototyp unter http://codepad.org/idlXdij3 .

Ich werde den Code auch inline posten, für diejenigen, die nicht auf den Link klicken möchten:

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

Wenn Sie ein Array als String speichern möchten, verwenden Sie serialize [docs] und unserialize [docs] .

Um Ihre Frage zu beantworten: Nein, es gibt keine eingebaute function, um die Ausgabe von print_r in ein Array zu parsen.

Nein, aber Sie können sowohl serialize als auch json_* -functionen verwenden.

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

Oder:

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

Für die Array-Ausgabe mit Subarrays funktioniert die von ninetwozero bereitgestellte Lösung nicht. Sie können diese function mit komplexen Arrays verwenden:

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

Es gibt einen winzigen Fehler, wenn Sie einen leeren Wert haben (leere Zeichenfolge), wird er in den vorherigen Wert eingebettet.

Sie können dies nicht mit print_r tun,
var_export sollte etwas ähnliches erlauben, aber nicht genau das, wonach du gefragt hast

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

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

Es gibt ein nettes Online-Tool, das genau wie es heißt:

print_r zu json Online-Konverter

Von einem JSON-Objekt aus ist es nicht weit, ein Array mit der json_decode- function zu erstellen :

Um daraus ein Array zu erhalten, setzen Sie den zweiten Parameter auf true. Wenn Sie dies nicht tun, erhalten Sie stattdessen ein Objekt.

 json_decode($jsondata, true); 

Schnellfunktion (ohne Überprüfungen, wenn Sie gute Daten senden):

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

Dies ist die erwartete Eingabe:

 Array ( [test] => 6 ) 

Ich denke meine function ist auch cool, arbeitet mit verschachtelten Arrays:

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

NB: besser nicht mit Benutzereingabedaten verwenden

Es gibt ein Online-Tool, das helfen kann http://www.printr-reverse.org/

Es macht einen anständigen Job, aber vermisst Kommas nach Sub-Arrays und vielleicht an anderen Stellen, so dass ein kleiner manueller Fix die Aufgabe erledigen sollte.