Diziyi bir dosyaya yazdırma


181

Bir diziyi bir dosyaya yazdırmak istiyorum.

Dosyanın böyle bir kodun nasıl göründüğüne tamamen benzemesini istiyorum.

print_r ($abc); $ abc'nin bir dizi olduğunu varsayarsak.

Her görünüm için düzenli olmaktan ziyade bunun için tek bir hat çözümü var mı?

PS - Şu anda serialize kullanın ama okunabilirlik serileştirilmiş diziler ile oldukça zor olduğu için dosyaları okunabilir yapmak istiyorum.

Yanıtlar:


309

Ya var_exportveya set print_ryazdırmadan yerine çıktı dönmesi için.

PHP kılavuzundan örnek

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

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

Daha sonra kaydedebilirsiniz $resultsile file_put_contents. Veya dosyaya yazarken doğrudan geri gönderin:

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

SADECE "[0] => blah" dizisinin tamamını değil dizinin içeriğini nasıl kaydedebilirsiniz?
user1899415

14
@ user1899415 implodeile dizi PHP_EOLve sonuç dizesini dosyaya yazın.
Gordon

13
var_exportphp sözdiziminde dosyayı kaydetmek istiyorsanız daha iyidir. print_rdöner [m] => monkeyama var_exportdöner'm' => 'monkey'
Pedram Behroozi

1
@ Evet, file_put_contents içindeki $ flags seçeneğini işaretleyin.
Gordon

5
@Bu örnek için FILE_APPEND kullanacaksınız: file_put_contents ('dosyaadı.txt', print_r ($ b, true), FILE_APPEND); her seferinde üzerine yazmadan dosya sonuna ekler. Ayrıca, bunu şu şekilde değiştirebilirsiniz: print_r ($ b, true). Ek satır sonu veya yeni satır eklemek için "\ n" .
Tarik

53

Sadece kullanın print_r; ) Belgeleri okuyun :

Çıktısını yakalamak isterseniz print_r(), returnparametresini kullanın . Bu parametre ayarlandığında TRUE, print_r() bilgi iade ziyade yazdırılır.

Yani bu bir olasılık:

$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

Deneyebilirsiniz:

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

trueVar_export parametresinin ikinci parametresini ekleyin, aksi takdirde dosyaya yazılacak içerik yoktur.
Progrock

dizi değerlerini tırnak içine aldığından var_export tecrübelerime göre daha iyi bir çözümdü, bu yüzden dizi değerlerine erişmek için include / gereksinimi kullanırken daha iyi
işliyor

8

Hızlı ve basit bunu yapın:

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

4

Bunu $myArrayArray olarak deneyebilirsiniz

$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

Ben sadece metin olarak bir dizi çıktı için bu işlevi yazdı:

Güzel biçimlendirilmiş dizi çıktı gerekir.

ÖNEMLİ NOT:

Kullanıcı girişine dikkat edin.

Bu komut dosyası dahili kullanım için oluşturuldu.

Bunu genel kullanım için kullanmayı düşünüyorsanız, komut dosyası enjeksiyonunu önlemek için bazı ek veri doğrulama eklemeniz gerekir.

Bu aptalca bir kanıt değildir ve yalnızca güvenilir verilerle kullanılmalıdır.

Aşağıdaki fonksiyon aşağıdaki gibi bir çıktı verecektir:

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

burada fonksiyon (not: fonksiyon şu anda oop uygulaması için biçimlendirilmiştir.)

  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;
  }

Alternatif olarak ben de bir süre önce yazdığım bu komut dosyası kullanabilirsiniz:

Bu, bir dizinin bölümlerini kopyalayıp yapıştırmak için iyidir.

(Serileştirilmiş çıktı ile bunu yapmak neredeyse imkansız olurdu)

En temiz işlevi değil ama işi hallediyor.

Bu, aşağıdaki gibi çıkacaktır:

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

Ayrıca kullanıcı girdilerine de dikkat edin. İşte 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
Bildiğim kadarıyla print_r veri çalışma php kodu olarak kopyalanabilir ve yapıştırılabilir bir biçimde çıktı vermez.Bu çıktı bir çalışma dizisi olarak kopyalanabilir ve yapıştırılabilir bir şekilde biçimlendirir.
Dieter Gribnitz

2

sadece file_put_contents('file',$myarray); file_put_contents () kullanın dizilerle de çalışır.


2
Bence file_put_contents'ın ikinci argüman için sadece tek bir dizi ile çalışabileceğini belirtmek gerekir.
user3610279

1

İşte son 17 saatte öğrendiğim şey, benzer bir çözüm ararken problemimi çözdü.

kaynaklar:

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

Özel 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

Ne yukarıdan aldı, $ arr [meyve] "" (çift tırnak) içine girebilir ve daha fazla işlem için PHP tarafından dize olarak kabul edilebilir.

İkinci Kaynak yukarıdaki cevaplardan birindeki koddur:

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

Bu bilmediğim ikinci şey, FILE_APPEND.

Ne elde etmek çalışıyordum, bir dosyadan içerik almak, istenen verileri düzenlemek ve dosyayı yeni verilerle güncelleyin, ancak eski verileri sildikten sonra.

Şimdi sadece güncellenmiş veri eklemeden önce dosyadan veri silmeyi bilmem gerekiyor.

Diğer çözümler hakkında:

Sadece diğer insanlara yardımcı olabilir; Ben çalıştığımızda var_export veya print_r veya seri hale getirmek veya Json.Encode , ben de => ya da benzeri özel karakterleri var; veya 'veya [] dosyasında veya bir tür hatada. Tüm hataları hatırlamak için çok fazla şey denedim. Bu nedenle, birisi tekrar denemek isteyebilirse (benimkinden farklı bir senaryoya sahip olabilir), hatalar bekleyebilir.

Dosya okuma, düzenleme ve güncelleme hakkında:

Kullandığım () fgets bir içine yük dosya dizisi fonksiyonu değişken ($ dizi) ve daha sonra kullanmak sertleşmemiş ($ dizi [x]) , özellikle dizi kaldırma (x istenen dizi numarası, 1,2,3 vb anlamına gelir) elde edilmektedir. Ardından diziyi başka bir değişkene yeniden endekslemek ve yüklemek için dizi_değerleri () kullanın ve sonra diziyi (özel karakterler olmadan) hedef dosyaya dökmek için bir while döngüsü ve yukarıdaki çözümleri kullanın.

$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

Aşağıda kullanarak iyi çalışmalı ve daha okunabilir <pre>

<?php 

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

1

Ancak op dosyada olduğu gibi dizi yazmak gerekiyor Ben dosya için bir dizi yazabilirsiniz ve daha sonra kolayca php kullanarak daha sonra okuyabilirsiniz bir çözüm bulmak için bu sayfayı indi.

Herkes burada aynı arıyor kodu böylece json_encode kullanarak kendimi çözüm bulduk:

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

okumaktan daha

$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."];");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.