web-dev-qa-db-ja.com

配列をファイルに出力

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

このようなコードがどのように表示されるかとまったく同じようにファイルを表示したいと思います。

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

各外観に対して通常ではなく、これに対して1行の解決策はありますか。

P.S - 現在シリアライズを使用していますが、シリアライズされた配列では読みやすさが非常に難しいため、ファイルを読みやすくしたいです。

出力を表示せずに返すには、 var_export またはset print_r を設定します。

PHP manualの例

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

print_rを使うだけです。 ) ドキュメント を読んでください。

print_r()の出力を取得したい場合は、returnパラメーターを使用してください。このパラメータをTRUEに設定すると、print_r()は情報を表示せずに情報を返します。

だからこれは一つの可能​​性です:

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

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

25
binaryLV

あなたが試すことができます:

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

素早く簡単にこれを行います。

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

あなたはこれを試すことができます、配列として$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
Ahmad

私はちょうどテキストとして配列を出力するためにこの関数を書きました:

うまくフォーマットされた配列を出力するべきです。

重要な注意点:

ユーザー入力に注意してください。

このスクリプトは内部使用のために作成されました。

あなたがこれを公共の用途に使うつもりなら、スクリプトインジェクションを防ぐためにいくつかの追加のデータ検証を追加する必要があるでしょう。

これは絶対確実なものではなく、信頼できるデータのみと一緒に使用する必要があります。

次の関数は次のように出力されます。

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

これが関数です(注:functionは現在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;
  }
4
Dieter Gribnitz

file_put_contents('file',$myarray);を使うだけfile_put_contents()は配列でも動作します。

1
Patrick Mutwiri

以下は<pre>を使用してよりよく読みやすくなるはずです

<?php 

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

これが私が過去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によって文字列として受け入れられることができます。

Second Resourceは、上記の答えの1つのコードです。

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

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

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

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

他の解決策について:

まさにそれが他の人々に役立つかもしれないように。 var_export または Print_r または Serialize または Jsonを試したとき。 をエンコードしてください。=>や;のような特殊文字を使っています。ファイル内の 'または[]または何らかのエラー。すべてのエラーを記憶するには多すぎることを試みました。そのため、誰かがもう一度試してみると(私とは異なるシナリオになるかもしれません)、エラーが発生する可能性があります。

ファイルの読み込み、編集、更新について:

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
Sumit

しかし、opはファイル上にあるので配列を書く必要があります。ファイルに配列を書くことができ、後で再びphpを使って簡単に読むことができる解決策を見つけるためにこのページに着手しました。

私はjson_encodeを使って自分の解決策を見つけたので、他の誰かが同じことを探しているのであれば、ここにコードがあります。

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

読むより

$array = file_get_contents('array.tmp');
$array = json_decode($array,true);
0
vividus designs