Stampa array su un file


180

Vorrei stampare un array su un file.

Vorrei che il file fosse esattamente simile a come appare un codice come questo.

print_r ($abc); supponendo che $ abc sia un array.

C'è una soluzione a una linea per questo piuttosto che regolare per ogni look.

PS: attualmente utilizzo la serializzazione ma voglio rendere leggibili i file poiché la leggibilità è piuttosto difficile con gli array serializzati.

Risposte:


308

O var_exportimpostare print_rper restituire l'output invece di stamparlo.

Esempio dal manuale di PHP

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

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

È quindi possibile salvare $resultscon file_put_contents. Oppure restituiscilo direttamente quando scrivi sul file:

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

Come è possibile salvare SOLO i contenuti dell'array e non l'intero array "[0] => blah" ??
user1899415

14
@ user1899415 implodel'array con PHP_EOLe scrivere la stringa risultante su file.
Gordon,

13
var_exportè meglio se si desidera salvare il file nella sintassi php. print_rritorna [m] => monkeyma var_exportritorna'm' => 'monkey'
Pedram Behroozi,

1
@ Sì, controlla l'opzione $ flags in file_put_contents.
Gordon,

5
@Wold usa FILE_APPEND per questo esempio: file_put_contents ('filename.txt', print_r ($ b, true), FILE_APPEND); li aggiungerà alla fine del file senza sovrascriverli ogni volta. Inoltre, puoi cambiarlo in: print_r ($ b, true). "\ n" per aggiungere un'interruzione di riga aggiuntiva o nuova riga.
Tarik,

53

Basta usare print_r; ) Leggi la documentazione :

Se si desidera acquisire l'output di print_r(), utilizzare il returnparametro Quando questo parametro è impostato su TRUE, print_r() restituirà le informazioni anziché stamparle.

Quindi questa è una possibilità:

$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

Puoi provare:

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

Aggiungi il secondo parametro di truea var_export, altrimenti non c'è contenuto da scrivere nel file.
Progrock

var_export è stata una soluzione migliore nella mia esperienza in quanto racchiude la variabile di array tra virgolette, quindi gestisce meglio quando si utilizza include /
request

8

Semplice e veloce fai questo:

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

4

Puoi provare questo, $myArraycome 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

Ho appena scritto questa funzione per generare un array come testo:

Dovrebbe produrre un array ben formattato.

NOTA IMPORTANTE:

Attenzione agli input dell'utente.

Questo script è stato creato per uso interno.

Se si intende utilizzarlo per uso pubblico, sarà necessario aggiungere ulteriori convalide dei dati per impedire l'iniezione di script.

Questo non è a prova di errore e dovrebbe essere usato solo con dati affidabili.

La seguente funzione produrrà qualcosa di simile:

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

ecco la funzione (nota: la funzione è attualmente formattata per l'implementazione di 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;
  }

In alternativa puoi usare questo script che ho scritto anche qualche tempo fa:

Questo è bello per copiare e incollare parti di un array.

(Sarebbe quasi impossibile farlo con output serializzato)

Non è la funzione più pulita ma esegue il lavoro.

Questo uscirà come segue:

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

Prestare attenzione anche all'input dell'utente. Ecco il codice

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
Per quanto ne so, print_r non genera i dati in un formato che può essere copiato e incollato come codice php funzionante. Questo formatterà l'output in un modo che può essere copiato e incollato come un array funzionante.
Dieter Gribnitz,

2

usa solo file_put_contents('file',$myarray); file_put_contents () funziona anche con gli array.


2
Questa dovrebbe essere davvero la risposta accettata secondo me, anche se vale la pena notare che file_put_contents può funzionare solo con un singolo array per il suo secondo argomento.
user3610279

1

Ecco cosa ho imparato nelle ultime 17 ore che ha risolto il mio problema durante la ricerca di una soluzione simile.

risorse:

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

Codice specifico:

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

Quello che ho preso da sopra, $ arr [fruit] può andare dentro "" (virgolette doppie) ed essere accettato come stringa da PHP per ulteriori elaborazioni.

La seconda risorsa è il codice in una delle risposte sopra:

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

Questa è la seconda cosa che non sapevo, FILE_APPEND.

Quello che stavo cercando di ottenere è ottenere contenuti da un file, modificare i dati desiderati e aggiornare il file con nuovi dati ma dopo aver eliminato i vecchi dati.

Ora ho solo bisogno di sapere come eliminare i dati dal file prima di aggiungere dati aggiornati.

Informazioni su altre soluzioni:

Solo in modo che possa essere utile ad altre persone; quando ho provato var_export o Print_r o Serialize o Json.Encode , ho ricevuto caratteri speciali come => o; o 'o [] nel file o qualche tipo di errore. Ho provato troppe cose per ricordare tutti gli errori. Quindi, se qualcuno potrebbe volerli provare di nuovo (potrebbe avere uno scenario diverso dal mio), potrebbero aspettarsi errori.

Informazioni sulla lettura di file, modifica e aggiornamento:

Ho usato la funzione fgets () per caricare un array di file in una variabile ($ array) e quindi ho usato unset ($ array [x]) (dove x rappresenta il numero di array desiderato, 1,2,3 ecc.) Per rimuovere un determinato array. Quindi utilizzare array_values ​​() per reindicizzare e caricare l'array in un'altra variabile e quindi utilizzare un ciclo while e soluzioni superiori per scaricare l'array (senza caratteri speciali) nel file di destinazione.

$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

Di seguito dovrebbe funzionare bene e più leggibile 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

Comunque op ha bisogno di scrivere un array così com'è su file Sono arrivato a questa pagina per scoprire una soluzione in cui posso scrivere un array su file e che posso facilmente leggere in seguito usando di nuovo php.

Ho trovato la mia soluzione usando json_encode in modo che chiunque stia cercando lo stesso qui è il codice:

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

di leggere

$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."];");
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.