In mảng thành tập tin


180

Tôi muốn in một mảng vào một tập tin.

Tôi muốn các tập tin trông giống hệt như một mã như thế này.

print_r ($abc); giả sử $ abc là một mảng.

Có bất kỳ giải pháp một dòng cho điều này hơn là thường xuyên cho mỗi cái nhìn.

PS - Tôi hiện đang sử dụng tuần tự hóa nhưng tôi muốn làm cho các tệp có thể đọc được vì khả năng đọc khá khó với các mảng được tuần tự hóa.

Câu trả lời:


308

Hoặc var_exporthoặc đặt print_rđể trả về đầu ra thay vì in nó.

Ví dụ từ hướng dẫn sử dụng PHP

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

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

Sau đó bạn có thể lưu $resultsvới file_put_contents. Hoặc trả lại trực tiếp khi ghi vào tệp:

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

Làm thế nào bạn CHỈ có thể lưu nội dung của mảng chứ không phải toàn bộ mảng "[0] => blah" ??
dùng1899415

14
@ user1899415 implodemảng với PHP_EOLvà ghi chuỗi kết quả vào tệp.
Gordon

13
var_exportsẽ tốt hơn nếu bạn muốn lưu tệp theo cú pháp php. print_rtrả lại [m] => monkeynhưng var_exporttrả lại'm' => 'monkey'
Pedram Behroozi

1
@ Có, kiểm tra tùy chọn $ flags trong file_put_contents.
Gordon

5
@Wold sử dụng FILE_APPEND cho ví dụ này: file_put_contents ('filename.txt', print_r ($ b, true), FILE_APPEND); nó sẽ thêm chúng vào cuối tập tin mà không ghi đè mỗi lần. Hơn nữa, bạn có thể thay đổi nó thành: print_r ($ b, true). "\ n" để thêm ngắt dòng hoặc dòng mới.
Tarik

53

Chỉ cần sử dụng print_r; ) Đọc tài liệu :

Nếu bạn muốn nắm bắt đầu ra của print_r(), hãy sử dụng returntham số. Khi tham số này được đặt thành TRUE, print_r() sẽ trả về thông tin thay vì in nó.

Vì vậy, đây là một khả năng:

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


25

Bạn có thể thử:

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

Thêm tham số thứ hai của truevar_export, nếu không thì không có nội dung để ghi vào tệp.
Progrock

var_export là một giải pháp tốt hơn theo kinh nghiệm của tôi vì nó bao bọc biến mảng trong dấu ngoặc kép để xử lý tốt hơn khi sử dụng bao gồm / yêu cầu truy cập các giá trị mảng
Pete - iCalculator

8

Nhanh chóng và đơn giản làm điều này:

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

4

Bạn có thể thử điều này, $myArraynhư là 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

Tôi chỉ viết hàm này để xuất ra một mảng dưới dạng văn bản:

Nên đầu ra mảng định dạng độc đáo.

LƯU Ý QUAN TRỌNG:

Cẩn thận với đầu vào của người dùng.

Kịch bản này đã được tạo ra để sử dụng nội bộ.

Nếu bạn có ý định sử dụng điều này cho mục đích sử dụng công cộng, bạn sẽ cần thêm một số xác thực dữ liệu bổ sung để ngăn chặn việc tiêm script.

Đây không phải là bằng chứng ngu ngốc và chỉ nên được sử dụng với dữ liệu đáng tin cậy.

Hàm sau sẽ xuất ra một cái gì đó như:

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

đây là chức năng (lưu ý: chức năng hiện đang được định dạng để thực hiện 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;
  }

Thay phiên bạn có thể sử dụng kịch bản này tôi cũng đã viết cách đây một thời gian:

Điều này là tốt đẹp để sao chép và dán các phần của một mảng.

(Sẽ gần như không thể làm điều đó với đầu ra nối tiếp)

Không phải là chức năng sạch nhất nhưng nó hoàn thành công việc.

Điều này sẽ xuất ra như sau:

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

Cũng chăm sóc cho đầu vào của người dùng. Đây là mã.

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
Theo như tôi biết print_r không xuất dữ liệu theo định dạng có thể sao chép và dán dưới dạng mã php đang hoạt động. Điều này sẽ định dạng đầu ra theo cách có thể sao chép và dán dưới dạng mảng làm việc.
kiêng Gribnitz

2

chỉ sử dụng file_put_contents('file',$myarray); file_put_contents () cũng hoạt động với mảng.


2
Theo tôi, đây thực sự là câu trả lời được chấp nhận, mặc dù đáng lưu ý rằng file_put_contents chỉ có thể hoạt động với một mảng duy nhất cho đối số thứ hai.
dùng3610279

1

Đây là những gì tôi học được trong 17 giờ qua đã giải quyết vấn đề của tôi trong khi tìm kiếm một giải pháp tương tự.

tài nguyên:

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

Mã cụ thể:

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

Những gì tôi đã lấy từ trên, $ Array [fruit] có thể vào bên trong "" (dấu ngoặc kép) và được PHP chấp nhận dưới dạng chuỗi để xử lý thêm.

Tài nguyên thứ hai là mã trong một trong những câu trả lời ở trên:

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

Đây là điều thứ hai tôi không biết, FILE_APPEND.

Những gì tôi đã cố gắng đạt được là lấy nội dung từ một tệp, chỉnh sửa dữ liệu mong muốn và cập nhật tệp với dữ liệu mới nhưng sau khi xóa dữ liệu cũ.

Bây giờ tôi chỉ cần biết cách xóa dữ liệu khỏi tập tin trước khi thêm dữ liệu cập nhật.

Về các giải pháp khác:

Chỉ để nó có thể hữu ích cho những người khác; khi tôi thử var_export hoặc Print_r hoặc serialize hoặc Json.Encode , tôi có các ký tự đặc biệt như => hoặc; hoặc 'hoặc [] trong tệp hoặc một số loại lỗi. Đã thử quá nhiều thứ để nhớ tất cả các lỗi. Vì vậy, nếu ai đó có thể muốn thử lại chúng (có thể có kịch bản khác với tôi), họ có thể gặp lỗi.

Về đọc tệp, chỉnh sửa và cập nhật:

Tôi đã sử dụng hàm fgets () để tải mảng tệp vào một biến ($ mảng) và sau đó sử dụng unset ($ mảng [x]) (trong đó x là viết tắt của số mảng mong muốn, 1,2,3, v.v.) để loại bỏ mảng cụ thể. Sau đó, sử dụng mảng_values ​​() để lập chỉ mục lại và tải mảng vào một biến khác và sau đó sử dụng một vòng lặp while và các giải pháp trên để kết xuất mảng (không có bất kỳ ký tự đặc biệt nào) vào tệp đích.

$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

Dưới đây nên hoạt động tốt và dễ đọc hơn bằng cách sử dụng <pre>

<?php 

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

1

Tuy nhiên, op cần phải viết mảng như trong tệp. Tôi đã truy cập trang này để tìm ra giải pháp nơi tôi có thể viết một mảng vào tệp và có thể dễ dàng đọc lại sau khi sử dụng php.

Tôi đã tự tìm ra giải pháp cho mình bằng cách sử dụng json_encode để bất kỳ ai khác đang tìm kiếm tương tự ở đây là mã:

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

hơn đọc

$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."];");
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.