¿Cómo crear una matriz a partir de la salida de una matriz impresa con print_r?

Resuelto John Kar. asked hace 54 años • 11 respuestas

Tengo una matriz:

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

y lo hago:

print_r($a);

que imprime:

Array ( [foo] => printme )

¿Existe una función, por lo que al hacer:

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

¿ Recuperaré la matriz array('foo' => 'fooMe');?

John Kar. avatar Jan 01 '70 08:01 John Kar.
Aceptado

De hecho, escribí una función que analiza una "matriz de cadenas" en una matriz real. Obviamente, es algo complicado y todo eso, pero funciona en mi caso de prueba. Aquí hay un enlace a un prototipo funcional en http://codepad.org/idlXdij3 .

También publicaré el código en línea, para aquellas personas que no tienen ganas de hacer clic en el enlace:

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

    }
?>
karllindmark avatar Aug 11 '2011 13:08 karllindmark

Si desea almacenar una matriz como una cadena, use serialize [docs] y unserialize [docs] .

Para responder a su pregunta: No, no hay ninguna función incorporada para analizar la salida print_ren una matriz nuevamente.

Felix Kling avatar Aug 11 '2011 12:08 Felix Kling

No. Pero puedes usar ambas funciones serializey json_*.

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

$a = unserialize($input);

O:

echo json_encode($a);

$a = json_decode($input, true);
cutsoy avatar Aug 11 '2011 12:08 cutsoy