배열을 파일로 인쇄


180

배열을 파일로 인쇄하고 싶습니다.

파일이 이와 비슷한 모양과 정확히 똑같이 보이기를 원합니다.

print_r ($abc); $ abc가 배열이라고 가정합니다.

각 모양마다 규칙적인 것이 아니라 하나의 라인 솔루션이 있습니까?

추신-현재 직렬화를 사용하고 있지만 직렬화 된 배열에서는 가독성이 매우 어렵 기 때문에 파일을 읽을 수있게하고 싶습니다.

답변:


308

하나 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

그런 다음 저장할 수 있습니다 $resultsfile_put_contents. 또는 파일에 쓸 때 직접 반환하십시오.

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

전체 배열 "[0] => blah"가 아닌 배열의 내용 만 어떻게 저장할 수 있습니까?
user1899415

14
@ user1899415 implode배열을 사용 PHP_EOL하여 결과 문자열을 파일에 씁니다.
Gordon

13
var_exportPHP 구문으로 파일을 저장하려면 더 좋습니다. print_r반환 [m] => monkey하지만 var_export반환'm' => 'monkey'
Pedram Behroozi

1
@Wold 예, file_put_contents에서 $ flags 옵션을 확인하십시오.
Gordon

5
@이 예제에서는 FILE_APPEND를 사용하십시오. file_put_contents ( 'filename.txt', print_r ($ b, true), FILE_APPEND); 매번 덮어 쓰지 않고 파일 끝에 추가합니다. 또한 print_r ($ b, true)로 변경할 수 있습니다 . 줄 바꿈이나 줄 바꿈을 추가하려면 "\ n"
Tarik

53

그냥 사용하십시오 print_r; ) 설명서를 읽으십시오 :

의 출력을 캡처 print_r()하려면 return매개 변수를 사용하십시오 . 이 매개 변수로 설정하면 TRUE, print_r() 정보를 반환하는 대신 그것을 인쇄 할 수 있습니다.

따라서 이것은 하나의 가능성입니다.

$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

시도해 볼 수 있습니다 :

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

truevar_export에 두 번째 매개 변수를 추가하십시오. 그렇지 않으면 파일에 쓸 내용이 없습니다.
Progrock

var_export는 배열 변수를 따옴표로 감싸서 배열 값에 액세스하기 위해 include / require를 사용할 때 더 잘 처리하므로 내 경험에서 더 나은 솔루션이었습니다.
Pete-iCalculator


4

$myArray배열로 이것을 시도 할 수 있습니다

$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.