Imprimir matriz en un archivo

181

Me gustaría imprimir una matriz en un archivo.

Me gustaría que el archivo se vea exactamente similar al aspecto de un código como este.

print_r ($abc); suponiendo que $ abc es una matriz.

¿Hay alguna solución de líneas para esto en lugar de regular para cada aspecto?

PD: actualmente uso serializar pero quiero que los archivos sean legibles ya que la legibilidad es bastante difícil con las matrices serializadas.

Atif Mohammed Ameenuddin
fuente

Respuestas:

309

Ya sea var_exporto configurado print_rpara devolver el resultado en lugar de imprimirlo.

Ejemplo del manual de PHP

$b = array (
    'm' => 'monkey', 
    'foo' => 'bar', 
    'x' => array ('x', 'y', 'z'));

$results = print_r($b, true); // $results now contains output from print_r

Luego puede guardar $resultscon file_put_contents. O devuélvalo directamente al escribir en el archivo:

file_put_contents('filename.txt', print_r($b, true));
Gordon
fuente
¿Cómo puede SOLO guardar el contenido de la matriz y no toda la matriz "[0] => blah"?
user1899415
14
@ user1899415 con implodela matriz PHP_EOLy escribe la cadena resultante en el archivo.
Gordon
13
var_exportes mejor si desea guardar el archivo en sintaxis php. print_rvuelve [m] => monkeypero var_exportvuelve'm' => 'monkey'
Pedram Behroozi
1
@Wold sí, marque la opción $ flags en file_put_contents.
Gordon
55
@Wold usa FILE_APPEND para este ejemplo: file_put_contents ('filename.txt', print_r ($ b, true), FILE_APPEND); los agregará al final del archivo sin sobrescribir cada vez. Además, puede cambiarlo a: print_r ($ b, verdadero). "\ n" para agregar un salto de línea adicional o una nueva línea.
Tarik
53

Solo usa print_r; ) Lea la documentación :

Si desea capturar la salida de print_r(), use elreturn parámetro Cuando este parámetro se establece en TRUE, print_r() devolverá la información en lugar de imprimirla.

Entonces esta es una posibilidad:

$fp = fopen('file.txt', 'w');
fwrite($fp, print_r($array, TRUE));
fclose($fp);
Felix Kling
fuente
26

file_put_contents($file, print_r($array, true), FILE_APPEND)

binaryLV
fuente
25

Tu podrías intentar:

$h = fopen('filename.txt', 'r+');
fwrite($h, var_export($your_array, true));
Sarfraz
fuente
Agregue el segundo trueparámetro de var_export, de lo contrario no hay contenido para escribir en el archivo.
Progrock
var_export fue una mejor solución en mi experiencia, ya que envuelve la variable de matriz entre comillas para que se maneje mejor cuando se usa include / require para acceder a los valores de la matriz
Pete - iCalculator
8

Rápido y simple hacer esto:

file_put_contents($filename, var_export($myArray, true));
alexwenzel
fuente
4

Puedes probar esto, $myArraycomo la matriz

$filename = "mylog.txt";
$text = "";
foreach($myArray as $key => $value)
{
    $text .= $key." : ".$value."\n";
}
$fh = fopen($filename, "w") or die("Could not open log file.");
fwrite($fh, $text) or die("Could not write file!");
fclose($fh);
Ahmad
fuente
4

Acabo de escribir esta función para generar una matriz como texto:

Debería generar una matriz bien formateada.

NOTA IMPORTANTE:

Cuidado con la entrada del usuario.

Este script fue creado para uso interno.

Si tiene la intención de usar esto para uso público, deberá agregar alguna validación de datos adicional para evitar la inyección de script.

Esto no es infalible y solo debe usarse con datos confiables.

La siguiente función generará algo como:

$var = array(
  'primarykey' => array(
    'test' => array(
      'var' => array(
        1 => 99,
        2 => 500,
      ),
    ),
    'abc' => 'd',
  ),
);

aquí está la función (nota: la función está formateada actualmente para la implementación oop).

  public function outArray($array, $lvl=0){
    $sub = $lvl+1;
    $return = "";
    if($lvl==null){
      $return = "\t\$var = array(\n";  
    }
      foreach($array as $key => $mixed){
        $key = trim($key);
        if(!is_array($mixed)){
          $mixed = trim($mixed);
        }
        if(empty($key) && empty($mixed)){continue;}
        if(!is_numeric($key) && !empty($key)){
          if($key == "[]"){
            $key = null;
          } else {
            $key = "'".addslashes($key)."'";
          }
        }

        if($mixed === null){
          $mixed = 'null';
        } elseif($mixed === false){
          $mixed = 'false';
        } elseif($mixed === true){
          $mixed = 'true';
        } elseif($mixed === ""){
          $mixed = "''";
        } 

        //CONVERT STRINGS 'true', 'false' and 'null' TO true, false and null
        //uncomment if needed
        //elseif(!is_numeric($mixed) && !is_array($mixed) && !empty($mixed)){
        //  if($mixed != 'false' && $mixed != 'true' && $mixed != 'null'){
        //    $mixed = "'".addslashes($mixed)."'";
        //  }
        //}


        if(is_array($mixed)){
          if($key !== null){
            $return .= "\t".str_repeat("\t", $sub)."$key => array(\n";
            $return .= $this->outArray($mixed, $sub);
            $return .= "\t".str_repeat("\t", $sub)."),\n";
          } else {
            $return .= "\t".str_repeat("\t", $sub)."array(\n";
            $return .= $this->outArray($mixed, $sub);
            $return .= "\t".str_repeat("\t", $sub)."),\n";            
          }
        } else {
          if($key !== null){
            $return .= "\t".str_repeat("\t", $sub)."$key => $mixed,\n";
          } else {
            $return .= "\t".str_repeat("\t", $sub).$mixed.",\n";
          }
        }
    }
    if($lvl==null){
      $return .= "\t);\n";
    }
    return $return;
  }

Alternativamente, puede usar este script que también escribí hace un tiempo:

Este es bueno para copiar y pegar partes de una matriz.

(Sería casi imposible hacerlo con salida serializada)

No es la función más limpia pero hace el trabajo.

Este saldrá como sigue:

$array['key']['key2'] = 'value';
$array['key']['key3'] = 'value2';
$array['x'] = 7;
$array['y']['z'] = 'abc';

También tenga cuidado con la entrada del usuario. Aquí está el código.

public static function prArray($array, $path=false, $top=true) {
    $data = "";
    $delimiter = "~~|~~";
    $p = null;
    if(is_array($array)){
      foreach($array as $key => $a){
        if(!is_array($a) || empty($a)){
          if(is_array($a)){
            $data .= $path."['{$key}'] = array();".$delimiter;
          } else {
            $data .= $path."['{$key}'] = \"".htmlentities(addslashes($a))."\";".$delimiter;
          }
        } else {
          $data .= self::prArray($a, $path."['{$key}']", false);
        }    
      }
    }
    if($top){
      $return = "";
      foreach(explode($delimiter, $data) as $value){
        if(!empty($value)){
          $return .= '$array'.$value."<br>";
        }
      };
      echo $return;
    }
    return $data;
  }
Dieter Gribnitz
fuente
1
Hasta donde sé, print_r no genera los datos en un formato que se pueda copiar y pegar como código php de trabajo. Esto formateará la salida de una manera que se pueda copiar y pegar como una matriz de trabajo.
Dieter Gribnitz
2

solo use file_put_contents('file',$myarray); file_put_contents () también funciona con matrices.

Patrick Mutwiri
fuente
2
En mi opinión, esta debería ser la respuesta aceptada, aunque vale la pena señalar que file_put_contents solo puede funcionar con una sola matriz para su segundo argumento.
user3610279
1

Esto es lo que aprendí en las últimas 17 horas que resolvió mi problema mientras buscaba una solución similar.

recursos:

http://php.net/manual/en/language.types.array.php

Código especifico:

// The following is okay, as it's inside a string. Constants are not looked for
// within strings, so no E_NOTICE occurs here
print "Hello $arr[fruit]";      // Hello apple

Lo que tomé de arriba, $ arr [fruit] puede ir dentro de "" (comillas dobles) y ser aceptado como cadena por PHP para su posterior procesamiento.

El segundo recurso es el código en una de las respuestas anteriores:

file_put_contents($file, print_r($array, true), FILE_APPEND)

Esto es lo segundo que no sabía, FILE_APPEND.

Lo que estaba tratando de lograr es obtener contenido de un archivo, editar los datos deseados y actualizar el archivo con datos nuevos, pero después de eliminar los datos antiguos.

Ahora solo necesito saber cómo eliminar datos del archivo antes de agregar datos actualizados.

Sobre otras soluciones:

Solo para que pueda ser útil para otras personas; cuando probé var_export o Print_r o Serialize o Json.Encode , obtuve caracteres especiales como => o; o 'o [] en el archivo o algún tipo de error. Intenté demasiadas cosas para recordar todos los errores. Por lo tanto, si alguien quiere probarlos nuevamente (puede tener un escenario diferente al mío), puede esperar errores.

Acerca de la lectura de archivos, edición y actualización:

Utilicé la función fgets () para cargar la matriz de archivos en una variable ($ array) y luego utilicé unset ($ array [x]) (donde x representa el número de matriz deseado, 1,2,3, etc.) para eliminar una matriz particular. Luego use array_values ​​() para volver a indexar y cargar la matriz en otra variable y luego use un bucle while y soluciones anteriores para volcar la matriz (sin caracteres especiales) en el archivo de destino.

$x=0;

while ($x <= $lines-1) //$lines is count($array) i.e. number of lines in array $array
    {
        $txt= "$array[$x]";
        file_put_contents("file.txt", $txt, FILE_APPEND);
        $x++;
    }
Sumit
fuente
1

A continuación debería funcionar bien y ser más legible usando <pre>

<?php 

ob_start();
echo '<pre>';
print_r($array);
$outputBuffer = ob_get_contents();
ob_end_flush();
file_put_contents('your file name', $outputBuffer);
?>
kamal pal
fuente
1

Sin embargo, op necesita escribir una matriz, ya que está en el archivo. He llegado a esta página para encontrar una solución donde pueda escribir una matriz en un archivo y que pueda leer fácilmente más tarde usando php nuevamente.

He encontrado la solución yo mismo usando json_encode, por lo que cualquier otra persona está buscando lo mismo, aquí está el código:

file_put_contents('array.tmp', json_encode($array));

que leer

$array = file_get_contents('array.tmp');
$array = json_decode($array,true);
diseños vividus
fuente
0

prueba.php

<?php  
return [
   'my_key_1'=>'1111111',
   'my_key_2'=>'2222222',
];

index.php

// Read array from file
$my_arr = include './test.php';

$my_arr["my_key_1"] = "3333333";

echo write_arr_to_file($my_arr, "./test.php");

/**
* @param array $arr <p>array</p>
* @param string $path <p>path to file</p>
* example :: "./test.php"
* @return bool <b>FALSE</b> occurred error
* more info: about "file_put_contents" https://www.php.net/manual/ru/function.file-put-contents.php
**/
function write_arr_to_file($arr, $path){
    $data = "\n";
    foreach ($arr as $key => $value) {
        $data = $data."   '".$key."'=>'".$value."',\n";
    }
    return file_put_contents($path, "<?php  \nreturn [".$data."];");
}
Юрий Светлов
fuente