¿Cómo crear una matriz a partir de la salida de una matriz impresa con print_r?
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');
?
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;
}
}
?>
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_r
en una matriz nuevamente.
No. Pero puedes usar ambas funciones serialize
y json_*
.
$a = array('foo' => 'fooMe');
echo serialize($a);
$a = unserialize($input);
O:
echo json_encode($a);
$a = json_decode($input, true);