Array cetak ke file

180

Saya ingin mencetak array ke file.

Saya ingin file terlihat persis sama seperti bagaimana kode seperti ini terlihat.

print_r ($abc); dengan asumsi $ abc adalah sebuah array.

Apakah ada solusi satu baris untuk ini daripada biasa untuk setiap tampilan.

PS - Saat ini saya menggunakan serialisasi tetapi saya ingin membuat file dapat dibaca karena mudah dibaca dengan array serial.

Atif Mohammed Ameenuddin
sumber

Jawaban:

308

Entah var_exportatau setel print_runtuk mengembalikan output alih-alih mencetaknya.

Contoh dari manual PHP

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

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

Anda kemudian dapat menyimpan $resultsdengan file_put_contents. Atau kembalikan langsung saat menulis ke file:

file_put_contents('filename.txt', print_r($b, true));
Gordon
sumber
Bagaimana Anda HANYA bisa menyimpan isi array dan bukan seluruh array "[0] => bla" ??
user1899415
14
@ user1899415 implodearray dengan PHP_EOLdan menulis string yang dihasilkan ke file.
Gordon
13
var_exportlebih baik jika Anda ingin menyimpan file dalam sintaks php. print_rkembali [m] => monkeytetapi var_exportkembali'm' => 'monkey'
Pedram Behroozi
1
@Wold ya, periksa opsi $ flags di file_put_contents.
Gordon
5
@Wold gunakan FILE_APPEND untuk contoh ini: file_put_contents ('filename.txt', print_r ($ b, true), FILE_APPEND); itu akan menambahkan mereka di akhir file tanpa menimpa setiap kali. Selanjutnya, Anda dapat mengubahnya ke: print_r ($ b, true). "\ n" untuk menambahkan jeda baris tambahan atau baris baru.
Tarik
53

Cukup gunakan print_r; ) Baca dokumentasi :

Jika Anda ingin menangkap output dari print_r(), gunakan returnparameter. Ketika parameter ini diatur ke TRUE, print_r() akan mengembalikan informasi daripada mencetaknya.

Jadi ini adalah satu kemungkinan:

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

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

binaryLV
sumber
25

Kamu bisa mencoba:

$h = fopen('filename.txt', 'r+');
fwrite($h, var_export($your_array, true));
Sarfraz
sumber
Tambahkan param kedua trueke var_export, jika tidak ada konten untuk ditulis ke file.
Progrock
var_export adalah solusi yang lebih baik dalam pengalaman saya karena membungkus variabel array dalam tanda kutip sehingga menangani lebih baik ketika menggunakan include /
wajib
8

Cepat dan mudah lakukan ini:

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

Anda dapat mencoba ini, $myArraysebagai 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);
Ahmad
sumber
4

Saya baru saja menulis fungsi ini untuk menampilkan array sebagai teks:

Haruskah output array yang diformat dengan baik.

CATATAN PENTING:

Waspadai input pengguna.

Script ini dibuat untuk penggunaan internal.

Jika Anda bermaksud menggunakan ini untuk penggunaan umum, Anda perlu menambahkan beberapa validasi data tambahan untuk mencegah injeksi skrip.

Ini bukan bukti bodoh dan harus digunakan hanya dengan data tepercaya.

Fungsi berikut akan menampilkan sesuatu seperti:

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

di sini adalah fungsi (catatan: fungsi saat ini diformat untuk implementasi 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;
  }

Bergantian Anda dapat menggunakan skrip ini saya juga menulis beberapa saat yang lalu:

Yang ini bagus untuk menyalin dan menempel bagian dari array.

(Akan hampir mustahil untuk melakukan itu dengan output serial)

Bukan fungsi terbersih tetapi menyelesaikan pekerjaan.

Ini akan menampilkan sebagai berikut:

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

Perhatikan juga input pengguna. Ini kodenya.

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
sumber
1
Sejauh yang saya tahu print_r tidak menampilkan data dalam format yang dapat disalin dan ditempelkan sebagai kode php yang berfungsi. Ini akan memformat keluaran dengan cara yang dapat disalin dan ditempelkan sebagai array yang berfungsi.
Dieter Gribnitz
2

cukup gunakan file_put_contents('file',$myarray); file_put_contents () berfungsi dengan array juga.

Patrick Mutwiri
sumber
2
Ini seharusnya benar-benar jawaban yang diterima menurut pendapat saya, walaupun perlu dicatat bahwa file_put_contents hanya dapat bekerja dengan satu array untuk argumen kedua.
user3610279
1

Inilah yang saya pelajari dalam 17 jam terakhir yang memecahkan masalah saya saat mencari solusi yang sama.

sumber daya:

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

Kode Khusus:

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

Apa yang saya ambil dari atas, $ arr [fruit] bisa masuk ke dalam "" (tanda kutip ganda) dan diterima sebagai string oleh PHP untuk diproses lebih lanjut.

Sumber Kedua adalah kode di salah satu jawaban di atas:

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

Ini adalah hal kedua yang tidak saya ketahui, FILE_APPEND.

Apa yang saya coba capai adalah mendapatkan konten dari file, mengedit data yang diinginkan dan memperbarui file dengan data baru tetapi setelah menghapus data lama.

Sekarang saya hanya perlu tahu cara menghapus data dari file sebelum menambahkan data yang diperbarui.

Tentang solusi lain:

Hanya supaya itu bisa bermanfaat bagi orang lain; ketika saya mencoba var_export atau Print_r atau Serialize atau Json.Encode , saya mendapatkan karakter khusus seperti => atau; atau 'atau [] dalam file atau semacam kesalahan. Mencoba terlalu banyak hal untuk mengingat semua kesalahan. Jadi, jika seseorang ingin mencobanya lagi (mungkin memiliki skenario yang berbeda dari saya), mereka mungkin mengharapkan kesalahan.

Tentang membaca file, mengedit, dan memperbarui:

Saya menggunakan fungsi fgets () untuk memuat file array ke dalam variabel ($ array) dan kemudian menggunakan unset ($ array [x]) (di mana x berarti nomor array yang diinginkan, 1,2,3 dll) untuk menghapus array tertentu. Kemudian gunakan array_values ​​() untuk mengindeks ulang dan memuat array ke variabel lain dan kemudian menggunakan loop sementara dan solusi di atas untuk membuang array (tanpa karakter khusus) ke file target.

$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
sumber
1

Di bawah ini seharusnya berfungsi dengan baik dan lebih mudah dibaca <pre>

<?php 

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

Namun op perlu menulis array seperti pada file saya telah mendarat halaman ini untuk mengetahui solusi di mana saya dapat menulis array ke file dan daripada dapat dengan mudah dibaca nanti menggunakan php lagi.

Saya telah menemukan solusi sendiri dengan menggunakan json_encode sehingga orang lain mencari yang sama di sini adalah kode:

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

dari membaca

$array = file_get_contents('array.tmp');
$array = json_decode($array,true);
desain vividus
sumber
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."];");
}
Юрий Светлов
sumber