将数组打印到文件


180

我想将数组打印到文件中。

我希望文件看起来完全像这样的代码。

print_r ($abc); 假设$ abc是一个数组。

是否有任何一种解决方案,而不是每次外观都是常规的。

PS-我目前使用序列化,但是我想使文件可读,因为使用序列化数组很难读取。

Answers:


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

然后$results,您可以使用保存file_put_contents。或在写入文件时直接将其返回:

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

您如何只保存数组的内容,而不是整个数组“ [0] => blah”?
user1899415 2013年

14
@ user1899415 implode使用数组PHP_EOL并将结果字符串写入文件。
Gordon

13
var_export如果您想以php语法保存文件,则更好。print_r返回[m] => monkeyvar_export返回'm' => 'monkey'
Pedram Behroozi

1
@Wold是的,检查file_put_contents中的$ flags选项。
Gordon

5
@Wold在此示例中使用FILE_APPEND:file_put_contents('filename.txt',print_r($ b,true),FILE_APPEND); 它将在文件末尾添加它们,而不会每次都覆盖。此外,您可以将其更改为:print_r($ b,true)。“ \ n”添加额外的换行符或换行符。
塔里克

53

随便用print_r; )阅读文档

如果您想捕获的输出print_r(),请使用return参数。当此参数设置为时TRUEprint_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是一个更好的解决方案,因为它将数组变量用引号引起来,因此使用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/zh/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_exportPrint_rSerializeJson.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."];");
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.