Wydrukuj tablicę do pliku


180

Chciałbym wydrukować tablicę do pliku.

Chciałbym, aby plik wyglądał dokładnie tak, jak wygląda taki kod.

print_r ($abc); zakładając, że $ abc jest tablicą.

Czy istnieje jedno rozwiązanie liniowe do tego, a nie zwykłe dla każdego wyglądu.

PS - Obecnie używam serializacji, ale chcę, aby pliki były czytelne, ponieważ czytelność jest dość trudna w przypadku szeregowanych tablic.

Odpowiedzi:


308

Albo var_exportalbo ustaw, print_raby zwracać wyjście zamiast go drukować.

Przykład z podręcznika PHP

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

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

Następnie możesz zapisać za $resultspomocą file_put_contents. Lub zwróć bezpośrednio podczas pisania do pliku:

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

Jak zapisać TYLKO zawartość tablicy, a nie całą tablicę „[0] => bla”?
user1899415

14
@ user1899415 implodetablica za pomocą PHP_EOLi zapisz wynikowy ciąg do pliku.
Gordon,

13
var_exportjest lepsze, jeśli chcesz zapisać plik w składni php. print_rpowraca, [m] => monkeyale var_exportwraca'm' => 'monkey'
Pedram Behroozi

1
@Old tak, zaznacz opcję $ flags w file_put_contents.
Gordon

5
@ Wcześniej użyj FILE_APPEND w tym przykładzie: file_put_contents ('filename.txt', print_r ($ b, true), FILE_APPEND); doda je na końcu pliku bez nadpisywania za każdym razem. Ponadto możesz zmienić to na: print_r ($ b, true). „\ n”, aby dodać dodatkowy podział linii lub nową linię.
Tarik

53

Po prostu użyj print_r; ) Przeczytaj dokumentację :

Jeśli chcesz uchwycić wynik print_r(), użyj returnparametru. Gdy ten parametr jest ustawiony na TRUE, print_r() zwraca informacje, a nie je drukuje.

Jest to jedna możliwość:

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


25

Możesz spróbować:

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

Dodaj drugi parametr truedo var_export, w przeciwnym razie nie ma treści do zapisania w pliku.
Progrock,

var_export było lepszym rozwiązaniem z mojego doświadczenia, ponieważ otacza zmienną tablicową cudzysłowami, więc radzi sobie lepiej, gdy używasz włączania / wymaganego dostępu do wartości tablic
Pete - iCalculator

8

Szybko i prosto zrób to:

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

4

Możesz tego spróbować $myArrayjako 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

Właśnie napisałem tę funkcję, aby wyprowadzić tablicę jako tekst:

Powinien generować ładnie sformatowaną tablicę.

WAŻNA UWAGA:

Uważaj na dane wprowadzone przez użytkownika.

Ten skrypt został stworzony do użytku wewnętrznego.

Jeśli zamierzasz użyć tego do użytku publicznego, musisz dodać dodatkowe sprawdzanie poprawności danych, aby zapobiec wstrzyknięciu skryptu.

To nie jest głupi dowód i powinien być używany tylko z zaufanymi danymi.

Poniższa funkcja wyświetli coś takiego:

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

tutaj jest funkcja (uwaga: funkcja jest obecnie sformatowana do implementacji 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;
  }

Alternatywnie możesz użyć tego skryptu, który również napisałem jakiś czas temu:

Ten jest miły do ​​kopiowania i wklejania części tablicy.

(Byłoby to prawie niemożliwe do zrobienia z serializowanym wyjściem)

Nie najczystsza funkcja, ale wykonuje zadanie.

Ten wyświetli w następujący sposób:

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

Zadbaj także o wkład użytkownika. Oto kod.

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
O ile wiem print_r nie wysyła danych w formacie, który można skopiować i wkleić jako działający kod php. Spowoduje to sformatowanie danych wyjściowych w sposób, który można skopiować i wkleić jako działającą tablicę.
Dieter Gribnitz

2

wystarczy użyć file_put_contents('file',$myarray); file_put_contents () działa również z tablicami.


2
Moim zdaniem powinna to być naprawdę zaakceptowana odpowiedź, chociaż warto zauważyć, że file_put_contents może działać tylko z jedną tablicą, co jest drugim argumentem.
user3610279,

1

Oto, czego nauczyłem się w ciągu ostatnich 17 godzin, które rozwiązały mój problem, szukając podobnego rozwiązania.

zasoby:

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

Specyficzny kod:

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

To, co wziąłem z góry, $ arr [owoc] może wejść do „” (podwójne cudzysłowy) i zostać zaakceptowane przez PHP jako ciąg znaków do dalszego przetwarzania.

Drugi zasób to kod w jednej z powyższych odpowiedzi:

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

To druga rzecz, o której nie wiedziałem, FILE_APPEND.

To, co próbowałem osiągnąć, to pobrać zawartość z pliku, edytować pożądane dane i zaktualizować plik o nowe dane, ale po usunięciu starych danych.

Teraz muszę tylko wiedzieć, jak usunąć dane z pliku przed dodaniem zaktualizowanych danych.

O innych rozwiązaniach:

Tylko dlatego, że może być pomocny dla innych ludzi; kiedy próbowałem var_export lub Print_r lub Serialize lub Json.Encode , dostałem znaki specjalne, takie jak => lub; lub ”lub [] w pliku lub jakiś błąd. Próbowałem zbyt wielu rzeczy, aby zapamiętać wszystkie błędy. Więc jeśli ktoś może chcieć spróbować ponownie (może mieć inny scenariusz niż mój), może spodziewać się błędów.

Informacje o czytaniu pliku, edycji i aktualizacji:

Użyłem funkcji fgets (), aby załadować tablicę plików do zmiennej ($ tablica), a następnie użyłem unset ($ tablica [x]) (gdzie x oznacza żądany numer tablicy, 1,2,3 itd.), Aby usunąć konkretną tablicę. Następnie użyj array_values ​​(), aby ponownie zindeksować i załadować tablicę do innej zmiennej, a następnie użyć pętli while i powyższych rozwiązań, aby zrzucić tablicę (bez żadnych znaków specjalnych) do pliku docelowego.

$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

Poniżej powinno działać ładnie i bardziej czytelnie przy użyciu <pre>

<?php 

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

1

Jednak op musi napisać tablicę tak, jak jest w pliku. Wylądowałem na tej stronie, aby znaleźć rozwiązanie, w którym mogę napisać tablicę do pliku, a następnie łatwo odczytać później za pomocą php.

Znalazłem rozwiązanie samodzielnie, używając json_encode, więc każdy inny szuka tego samego, oto kod:

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

niż czytać

$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."];");
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.