配列をファイルに出力する


180

配列をファイルに出力したいのですが。

このようなコードがどのように見えるかのように、ファイルをまったく同じように見せたいです。

print_r ($abc); $ abcが配列であると仮定します。

外観ごとに通常ではなく、このための1行のソリューションはありますか?

PS-私は現在シリアライズを使用していますが、シリアライズされた配列では可読性が非常に難しいため、ファイルを読みやすくしたいと考えています。

回答:


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] =>何とか] ??
user1899415 2013

14
@ user1899415 implode配列とPHP_EOL結果の文字列をファイルに書き込みます。
ゴードン

13
var_exportファイルをphp構文で保存する場合は、こちらをお勧めします。print_r戻る[m] => monkeyvar_export戻る'm' => 'monkey'
Pedram Behroozi 2013年

1
@はいはい、file_put_contentsの$ flagsオプションをチェックします。
ゴードン

5
この例では@Woldは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() は、情報を印刷するのではなく返します。

したがって、これは1つの可能性です。

$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));

の2番目のtrueパラメーターをvar_exportに追加します。追加しないと、ファイルに書き込む内容がありません。
Progrock、2016年

var_exportは、配列変数を引用符
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 2013年

2

file_put_contents('file',$myarray); file_put_contents()を使用するだけで、配列でも機能します。


2
これは、私の意見では実際に受け入れられる答えになるはずですが、file_put_contentsは2番目の引数に対して単一の配列でしか機能しないことに注意してください。
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によって文字列として受け入れられ、さらに処理されます。

2番目のリソースは、上記の回答のいずれかのコードです。

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

これは、知らなかった2番目のこと、FILE_APPENDです。

私が達成しようとしていたのは、ファイルからコンテンツを取得し、目的のデータを編集して、古いデータを削除した後、新しいデータでファイルを更新することです。

更新されたデータを追加する前に、ファイルからデータを削除する方法を知る必要があるだけです。

他のソリューションについて:

他の人の役に立つかもしれないように。私がしようとしたときでvar_exportもしくはますprint_rまたはシリアル化または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.