2010-04-18 11 views
44

Solo quiero almacenar rápidamente una matriz que obtengo de una API remota, para poder jugar con ella en un host local.¿Cómo guardo una matriz en un archivo para acceder luego como una matriz con PHP?

Así:

  1. que actualmente tienen una matriz.
  2. Quiero que la gente use la matriz sin tener que obtenerla de la API.

No hay necesidad de rentabilidad, etc. aquí, este no es para un sitio real sólo para conseguir algunos métodos de desinfección/etc formato realizados en

¿Hay una función como store_array() o restore_arrray()?!

+3

principales bettwen JSON y funciones serialize binarios se mencionan aquí - http://stackoverflow.com/questions/804045/preferred-method-to- store-php-arrays-json-encode-vs-serialize/804089 # 804089. – retro

Respuesta

63

La mejor manera de hacerlo es serializando JSON. Es legible por humanos y obtendrá un mejor rendimiento (el archivo es más pequeño y más rápido de cargar/guardar). El código es muy fácil. Sólo dos funciones

código de ejemplo:

$arr1 = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); 
file_put_contents("array.json",json_encode($arr1)); 
# array.json => {"a":1,"b":2,"c":3,"d":4,"e":5} 
$arr2 = json_decode(file_get_contents('array.json'), true); 
$arr1 === $arr2 # => true 

Usted puede escribir sus propias funciones y store_array restore_array fácilmente con este ejemplo.

Para la comparación de velocidad, vea benchmark originalmente desde Preferred method to store PHP arrays (json_encode vs serialize).

+2

su código es incorrecto. no recuperarás una matriz con tu código. –

+1

Hay una falta de coincidencia de tipos en la segunda línea. Debería haber $ arr1. También debe pasar true como el segundo parámetro a json_decode para devolver la matriz. Código actualizado. – retro

+1

si la matriz es promedio (500-2000 entradas), entonces 'serialize' y' unserialize' es en realidad mucho más rápido. – Adam

29

Si no necesita que el archivo de volcado sea legible, puede simplemente serialize() la matriz.

almacenamiento:

file_put_contents('yourfile.bin', serialize($array)); 

recuperación:

$array = unserialize(file_get_contents('yourfile.bin')); 
+0

¿La extensión tiene que ser bin? –

+0

Cualquier extensión está bien – mt025

+0

Este ejemplo parece ser seguro. Pero a veces la llamada deserializar en la entrada del usuario puede ser peligrosa, ya que permite a un atacante definir cualquier variable con un valor arbitrario. –

1

serialze uso de php:

file_put_contents("myFile",serialize($myArray)); 
+1

Como no hay "necesidad de eficiencia", esta es la última opción que recomendaría. Puede ser fácil codificar una solución con serializar/deserializar, pero la matriz no está en un formato legible/editable si la gente realmente desea ver o modificar el archivo almacenado. Además, si se almacenan en un repositorio, todos los datos están en una línea, por lo que los cambios pequeños en matrices más grandes son muy difíciles de ver. –

7

Puede utilizar serialize para convertirlo en una cadena a escribir en el archivo, y el acompañando unserialize para devolverlo a una estructura de matriz.

Sugeriría utilizar una estructura independiente del lenguaje, como JSON. Esto le permitirá cargar los archivos usando diferentes lenguajes que PHP, en caso de que exista una posibilidad de eso más tarde. json_encode para almacenarlo y json_decode($str, true) para devolverlo.

20

Uso serialize y unserialize

// storing 
$file = '/tmp/out.data'; 
file_put_contents($file, serialize($mydata)); // $mydata is the response from your remote API 

// retreiving 
$var = unserialize(file_get_contents($file)); 

u otra, manera hacky:

var_export() hace exactamente lo que quiere, va a tomar cualquier tipo de variable y almacenarlo en una representación que el intérprete PHP puede leer de nuevo Puede combinarlo con file_put_contents para almacenarlo en el disco y usar file_get_contents y eval para leerlo nuevamente.

// storing 
$file = '/tmp/out.php'; 
file_put_contents($file, var_export($var, true)); 

// retrieving 
eval('$myvar = ' . file_get_contents($file) . ';'); 
+0

¿Cómo puede cargar esa salida var_export() nuevamente? Con eval()? Intenta var_exportar algún objeto. – retro

+0

Ya sea con eval, o simplemente incluya() el archivo. –

+0

Hm, realmente no veo en qué contexto '' incluiría' solo el trabajo: estuve intentándolo por un tiempo y fallando, hasta que encontré http://stackoverflow.com/questions/933506/how-to-read-output -of-var-export-into-a-variable-in-php - que confirma que 'eval' se debe usar para leer los datos' var_export'ed. – sdaau

0

Otra forma rápida no se ha mencionado aquí:

De esta manera añadir cabecera con <?php etiqueta de inicio, el nombre de la variable con \$my_array = escapado etiqueta final \$ y pie de página ?>.

Ahora puede usar include() como cualquier otro script php válido.

// storing 
$file = '/tmp/out.php'; 
file_put_contents($file, "<?php\n\$my_array = ".var_export($var, true).";\n?>"); 

// retrieving as included script 
include($file); 

//testing 
print_r($my_array); 

out.php se verá así

diferencias
<?php 
    $my_array = array (
    'a'=>1, 
    'b'=>2, 
    'c'=>3, 
    'd'=>4, 
    'e'=>5 
); 
?> 
Cuestiones relacionadas