Search code examples
phparraysstringvariablestype-conversion

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


I have an array:

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

and I do:

print_r($a);

which prints:

Array ( [foo] => printme )

Is there a function, so when doing:

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

I will get the array array('foo' => 'fooMe'); back?


Solution

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