พิมพ์อาร์เรย์เป็นไฟล์


181

ฉันต้องการพิมพ์อาเรย์เป็นไฟล์

ฉันต้องการให้ไฟล์มีลักษณะคล้ายกันกับว่าโค้ดลักษณะนี้มีลักษณะอย่างไร

print_r ($abc); สมมติว่า $ abc เป็นอาร์เรย์

มีโซลูชันหนึ่งบรรทัดสำหรับสิ่งนี้มากกว่าปกติสำหรับแต่ละลุค

ป.ล. - ตอนนี้ฉันใช้ซีเรียลไลซ์เซชัน แต่ฉันต้องการทำให้ไฟล์อ่านได้เนื่องจากความสามารถในการอ่านค่อนข้างยากด้วยอาเรย์อนุกรม

คำตอบ:


309

ไม่ว่าจะเป็นvar_exportหรือตั้งค่าprint_rให้ส่งคืนแทนที่จะพิมพ์

ตัวอย่างจากคู่มือ PHP

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

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

จากนั้นคุณสามารถบันทึกด้วย$results file_put_contentsหรือส่งคืนโดยตรงเมื่อเขียนเป็นไฟล์:

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

คุณจะบันทึกเนื้อหาของอาเรย์ได้อย่างไรและไม่ใช่อาเรย์ทั้งหมด "[0] => blah" ??
user1899415

14
@ user1899415 implodeอาร์เรย์ที่มีPHP_EOLและเขียนสตริงผลลัพธ์ไปยังไฟล์
กอร์ดอน

13
var_exportจะดีกว่าถ้าคุณต้องการบันทึกไฟล์ในรูปแบบ php print_rผลตอบแทน[m] => monkeyแต่var_exportผลตอบแทน'm' => 'monkey'
Pedram Behroozi

1
@ ตรวจสอบแล้วใช่ตรวจสอบตัวเลือกการตั้งค่าสถานะ $ ใน file_put_contents
Gordon

5
@old ใช้ FILE_APPEND สำหรับตัวอย่างนี้: file_put_contents ('filename.txt', print_r ($ b, จริง), FILE_APPEND); มันจะเพิ่มพวกเขาในตอนท้ายของไฟล์โดยไม่ต้องเขียนทับแต่ละครั้ง นอกจากนี้คุณสามารถเปลี่ยนเป็น: print_r ($ b, จริง) "\ n"เพื่อเพิ่มตัวแบ่งบรรทัดพิเศษหรือบรรทัดใหม่
Tarik

53

ใช้เพียงprint_r; ) อ่านเอกสาร :

หากคุณต้องการจับเอาท์พุทของprint_r()ให้ใช้returnพารามิเตอร์ เมื่อพารามิเตอร์นี้ถูกตั้งค่าTRUE, print_r() จะกลับข้อมูลที่มากกว่าการพิมพ์

ดังนั้นนี่คือความเป็นไปได้อย่างหนึ่ง:

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


25

คุณสามารถลอง:

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

เพิ่มพารามิเตอร์ที่สองของtrueไปที่ var_export มิฉะนั้นไม่มีเนื้อหาที่จะเขียนไปยังไฟล์
Progrock

var_export เป็นคำตอบที่ดีกว่าในประสบการณ์ของฉันเพราะมันครอบคลุมตัวแปรอาร์เรย์ในเครื่องหมายคำพูดดังนั้นจัดการได้ดีขึ้นเมื่อใช้การรวม / จำเป็นต้องเข้าถึงค่าอาร์เรย์
Pete - iCalculator


4

คุณสามารถลองสิ่งนี้$myArrayในฐานะ 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

ฉันเพิ่งเขียนฟังก์ชันนี้เพื่อส่งออกอาร์เรย์เป็นข้อความ:

ควรส่งออกรูปแบบอาร์เรย์อย่างดี

โน๊ตสำคัญ:

ระวังการป้อนข้อมูลของผู้ใช้

สคริปต์นี้สร้างขึ้นสำหรับใช้ภายใน

หากคุณตั้งใจจะใช้สิ่งนี้เพื่อการสาธารณะคุณจะต้องเพิ่มการตรวจสอบความถูกต้องของข้อมูลเพิ่มเติมเพื่อป้องกันการฉีดสคริปต์

นี่ไม่ใช่ข้อพิสูจน์ที่ผิดพลาดและควรใช้กับข้อมูลที่เชื่อถือได้เท่านั้น

ฟังก์ชั่นต่อไปนี้จะส่งออกบางอย่างเช่น:

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

นี่คือฟังก์ชั่น (หมายเหตุ: ฟังก์ชั่นปัจจุบันถูกจัดรูปแบบสำหรับการใช้งาน 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;
  }

อีกทางเลือกหนึ่งคุณสามารถใช้สคริปต์นี้ฉันยังเขียนในขณะที่ผ่านมา:

อันนี้ดีในการคัดลอกและวางส่วนของอาร์เรย์

(ใกล้จะเป็นไปไม่ได้ที่จะทำเช่นนั้นกับเอาท์พุทแบบอนุกรม)

ไม่ใช่ฟังก์ชั่นที่สะอาดที่สุด แต่ทำให้งานเสร็จ

อันนี้จะเอาท์พุทดังนี้:

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

ดูแลอินพุตของผู้ใช้ด้วย นี่คือรหัส

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
เท่าที่ฉันรู้ print_r ไม่ได้ส่งออกข้อมูลในรูปแบบที่สามารถคัดลอกและวางเป็นรหัส php การทำงานนี้จะจัดรูปแบบผลลัพธ์ในวิธีที่สามารถคัดลอกและวางเป็นอาร์เรย์ทำงาน
Dieter Gribnitz

2

เพียงใช้file_put_contents('file',$myarray); file_put_contents () ทำงานร่วมกับอาร์เรย์ด้วย


2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับในความคิดของฉันถึงแม้ว่ามันจะคุ้มค่าที่จะสังเกตเห็นว่า file_put_contents สามารถใช้ได้กับอาเรย์เดี่ยวเพราะเป็นอาร์กิวเมนต์ที่สอง
user3610279

1

นี่คือสิ่งที่ฉันเรียนรู้ใน 17 ชั่วโมงที่ผ่านมาซึ่งแก้ไขปัญหาของฉันในขณะที่ค้นหาวิธีแก้ไขปัญหาที่คล้ายกัน

ทรัพยากร:

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

รหัสเฉพาะ:

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

สิ่งที่ฉันนำมาจากข้างต้น $ arr [fruit] สามารถเข้าไปข้างใน "" (เครื่องหมายคำพูดคู่) และยอมรับโดย PHP สำหรับการประมวลผลเพิ่มเติม

ทรัพยากรที่สองคือรหัสในหนึ่งในคำตอบข้างต้น:

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

นี่คือสิ่งที่สองที่ฉันไม่รู้ FILE_APPEND

สิ่งที่ฉันพยายามทำให้สำเร็จคือรับเนื้อหาจากไฟล์แก้ไขข้อมูลที่ต้องการและอัปเดตไฟล์ด้วยข้อมูลใหม่ แต่หลังจากลบข้อมูลเก่า

ตอนนี้ฉันแค่ต้องรู้วิธีการลบข้อมูลจากไฟล์ก่อนที่จะเพิ่มข้อมูลที่อัปเดต

เกี่ยวกับโซลูชันอื่น ๆ :

เพียงเพื่อคนอื่นอาจเป็นประโยชน์ เมื่อฉันลองvar_exportหรือPrint_rหรือSerializeหรือJson.Encodeฉันมีตัวอักษรพิเศษเช่น => หรือ; หรือ 'หรือ [] ในไฟล์หรือมีข้อผิดพลาดบางอย่าง พยายามหลายสิ่งเกินไปที่จะจำข้อผิดพลาดทั้งหมด ดังนั้นหากใครบางคนอาจต้องการลองอีกครั้ง (อาจมีสถานการณ์ที่แตกต่างจากของฉัน) พวกเขาอาจคาดหวังข้อผิดพลาด

เกี่ยวกับการอ่านไฟล์การแก้ไขและการอัพเดต:

ฉันใช้ฟังก์ชั่นfgets ()เพื่อโหลดอาเรย์ของไฟล์ลงในตัวแปร ($ array)จากนั้นใช้unset ($ array [x]) (โดยที่ x ย่อมาจากหมายเลขอาเรย์ที่ต้องการ 1,2,3 ฯลฯ ) เพื่อลบอาร์เรย์เฉพาะ จากนั้นใช้array_values ​​()เพื่อจัดทำดัชนีอีกครั้งและโหลดอาร์เรย์ลงในตัวแปรอื่นจากนั้นใช้while ลูปและโซลูชันด้านบนเพื่อดัมพ์อาร์เรย์ (โดยไม่มีอักขระพิเศษใด ๆ ) ลงในไฟล์เป้าหมาย

$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

ด้านล่างควรใช้งานได้ดีและอ่านได้มากขึ้น <pre>

<?php 

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

1

อย่างไรก็ตาม op ต้องการเขียนอาเรย์เนื่องจากมันอยู่ในไฟล์ฉันได้เข้าสู่หน้านี้เพื่อค้นหาวิธีแก้ปัญหาที่ฉันสามารถเขียนอาเรย์ไปยังไฟล์และกว่าสามารถอ่านได้อย่างง่ายดายในภายหลังโดยใช้ php อีกครั้ง

ฉันได้พบวิธีแก้ปัญหาของตัวเองโดยใช้ json_encode ดังนั้นคนอื่นมองหาที่นี่เหมือนกันคือรหัส:

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

กว่าอ่าน

$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."];");
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.