How create an array from the output of an array printed with print_r? How create an array from the output of an array printed with print_r? arrays arrays

How create an array from the output of an array printed with print_r?


I actually wrote a function that parses a "stringed array" into an actual array. Obviously, it's somewhat hacky and whatnot, but it works on my testcase. Here's a link to a functioning prototype at http://codepad.org/idlXdij3.

I'll post the code inline too, for those people that don't feel like clicking on the link:

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


If you want to store an array as string, use serialize [docs] and unserialize [docs].

To answer your question: No, there is no built-in function to parse the output of print_r into an array again.


For Array output with Subarrays, the solution provided by ninetwozero will not work, you can try with this function that works with complex arrays:

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

There is one tiny bug, if you have an empty value (empty string) it gets embedded in the value before.