Imprimir matriz em um arquivo


180

Gostaria de imprimir uma matriz em um arquivo.

Gostaria que o arquivo parecesse exatamente semelhante à aparência de um código como esse.

print_r ($abc); assumindo que $ abc é uma matriz.

Existe alguma solução de linhas para isso, em vez de regular para cada visual.

PS - Eu atualmente uso serializar, mas quero tornar os arquivos legíveis, pois a legibilidade é bastante difícil com matrizes serializadas.

Respostas:


308

Ou var_exportdefina print_rpara retornar a saída em vez de imprimi-la.

Exemplo do manual do PHP

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

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

Você pode salvar $resultscom file_put_contents. Ou devolva-o diretamente ao gravar no arquivo:

file_put_contents('filename.txt', print_r($b, true));

Como você pode SOMENTE salvar o conteúdo da matriz e não a matriz inteira "[0] => blá"?
user1899415

14
@ user1899415 implodea matriz PHP_EOLe escreva a sequência resultante no arquivo.
22713 Gordon

13
var_exporté melhor se você deseja salvar o arquivo na sintaxe php. print_rretorna [m] => monkeymas var_exportretorna'm' => 'monkey'
Pedram Behroozi 5/10

1
@Wold sim, marque a opção $ flags em file_put_contents.
Gordon

5
@Wold usa FILE_APPEND neste exemplo: file_put_contents ('filename.txt', print_r ($ b, true), FILE_APPEND); irá adicioná-los no final do arquivo sem sobrescrever a cada vez. Além disso, você pode alterá-lo para: print_r ($ b, true). "\ n" para adicionar quebra de linha extra ou nova linha.
Tarik

53

Apenas use print_r; ) Leia a documentação :

Se você deseja capturar a saída de print_r(), use o returnparâmetro Quando este parâmetro estiver definido como TRUE, print_r() retornará as informações em vez de imprimi-las.

Portanto, esta é uma possibilidade:

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

26

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


25

Você poderia tentar:

$h = fopen('filename.txt', 'r+');
fwrite($h, var_export($your_array, true));

Adicione o segundo parâmetro de truea var_export, caso contrário, não há conteúdo para gravar no arquivo.
Progrock 5/01/16

var_export era uma solução melhor na minha experiência, uma vez que envolve a variável de matriz entre aspas assim alças melhores quando se utiliza incluem / exigem para acessar os valores da matriz
Pete - ICalculator

8

Rápido e simples, faça o seguinte:

file_put_contents($filename, var_export($myArray, true));

4

Você pode tentar isso, $myArraycomo o Array

$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);

4

Acabei de escrever esta função para gerar uma matriz como texto:

Deve gerar uma matriz bem formatada.

NOTA IMPORTANTE:

Cuidado com a entrada do usuário.

Este script foi criado para uso interno.

Se você pretende usar isso para uso público, precisará adicionar alguma validação de dados adicionais para evitar a injeção de scripts.

Isso não é à prova de idiotas e deve ser usado apenas com dados confiáveis.

A seguinte função produzirá algo como:

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

aqui está a função (nota: a função está atualmente formatada para implementação 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;
  }

Como alternativa, você pode usar esse script que também escrevi há um tempo:

É bom copiar e colar partes de uma matriz.

(Seria quase impossível fazer isso com saída serializada)

Não é a função mais limpa, mas faz o trabalho.

Este produzirá da seguinte maneira:

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

Também cuide da entrada do usuário. Aqui está o 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;
  }

1
No caso de impressão, o print_r não gera os dados em um formato que pode ser copiado e colado como código php ativo. Isso formatará a saída de uma maneira que possa ser copiada e colada como uma matriz de trabalho.
Dieter Gribnitz

2

basta usar file_put_contents('file',$myarray); file_put_contents () também funciona com matrizes.


2
Essa deve ser realmente a resposta aceita na minha opinião, embora seja interessante notar que file_put_contents só pode funcionar com uma única matriz para seu segundo argumento.
usar o seguinte comando

1

Aqui está o que aprendi nas últimas 17 horas que resolveu meu problema enquanto procurava uma solução semelhante.

Recursos:

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

Código Específico:

// 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

O que eu peguei acima, $ arr [fruit] pode ir dentro "" (aspas duplas) e ser aceito como string pelo PHP para processamento adicional.

Segundo recurso é o código em uma das respostas acima:

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

Esta é a segunda coisa que eu não sabia, FILE_APPEND.

O que eu estava tentando obter é obter o conteúdo de um arquivo, editar os dados desejados e atualizar o arquivo com novos dados, mas depois de excluir os dados antigos.

Agora só preciso saber como excluir dados do arquivo antes de adicionar dados atualizados.

Sobre outras soluções:

Apenas para que possa ser útil para outras pessoas; quando tentei var_export ou Print_r ou Serialize ou Json.Encode , obtive caracteres especiais como => ou; ou 'ou [] no arquivo ou algum tipo de erro. Tentei muitas coisas para lembrar todos os erros. Portanto, se alguém quiser tentar novamente (pode ter um cenário diferente do meu), poderá esperar erros.

Sobre a leitura de arquivos, edição e atualização:

Eu usei a função fgets () para carregar a matriz de arquivos em uma variável ($ array) e, em seguida, use unset ($ array [x]) (onde x representa o número desejado da matriz, 1,2,3 etc) para remover a matriz específica. Em seguida, use array_values ​​() para reindexar e carregar a matriz em outra variável e, em seguida, use um loop while e as soluções acima para despejar a matriz (sem caracteres especiais) no arquivo 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++;
    }

1

Abaixo Deve funcionar bem e mais legível usando <pre>

<?php 

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

1

No entanto, o op precisa escrever o array como está no arquivo. Eu cheguei nesta página para encontrar uma solução onde eu possa escrever um array em um arquivo e que possa ser facilmente lido mais tarde usando o php novamente.

Eu encontrei a solução comigo mesmo usando json_encode para que qualquer outra pessoa esteja procurando o mesmo, aqui está o código:

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

do que ler

$array = file_get_contents('array.tmp');
$array = json_decode($array,true);

0

test.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."];");
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.