将数组打印到文件中

207

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

我希望该文件看起来与以下代码类似。

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

是否有一行代码的解决方案,而不是常规的 for each 循环。

P.S - 我目前使用 serialize,但我想使文件可读性更好,因为 serialized 数组很难阅读。

14个回答

354
要么使用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

你可以使用file_put_contents$results保存起来。或者在写入文件时直接返回它。
file_put_contents('filename.txt', print_r($b, true));

你如何仅保存数组的内容而不是整个数组"[0] => blah"? - user1899415
16
使用 PHP_EOL 将数组进行拼接,然后将得到的字符串写入文件。 - Gordon
17
如果想要将文件保存为php语法,建议使用var_exportprint_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
显示剩余3条评论

57

直接使用print_r函数即可; ) 阅读文档:

如果想要获取print_r()的输出结果,可以使用return参数。将该参数设置为TRUE时,print_r()将返回信息而非打印它。

因此这是一种可能的方法:

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

31

你可以尝试:

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

1
var_export 的第二个参数设置为 true,否则无法将内容写入文件。 - Progrock
在我的经验中,var_export是更好的解决方案,因为它将数组变量用引号包装起来,所以在使用include/require访问数组值时处理更好。 - Pete - iCalculator

27
将 $array 的打印结果追加到 $file 中,保留原有内容。该操作使用函数 file_put_contents() 实现。

13

快速简单地完成此操作:

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

1
正确的答案是,因为它使用真实的PHP语法格式化代码(使用print_r的答案没有这样做)。 - Sliq

9

然而,OP需要像文件中一样写入数组。我来到这个页面是为了找到一个解决方案,可以将数组写入文件,然后再使用PHP轻松地读取。

我自己找到了解决方案,使用json_encode,所以任何其他人寻找相同解决方案的话,这里是代码:

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

比阅读更好的选择

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

8
您可以尝试这样做,将$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);

5
我刚刚编写了这个函数,用于将数组输出为文本:
应该以漂亮的格式输出数组。
重要提示:
注意用户输入。
此脚本是为内部使用而创建的。
如果您想将其用于公共用途,则需要添加一些额外的数据验证以防止脚本注入。
这不是绝对可靠的,只能使用受信任的数据。
以下函数将输出类似以下内容:
$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

以下是我在过去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_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++;
    }

2

只需使用file_put_contents('file',$myarray);,file_put_contents()也可以与数组一起使用。


2
在我看来,这确实应该是被采纳的答案,尽管值得注意的是file_put_contents只能使用单个数组作为其第二个参数。 - user3610279
将关联数组打印为文本“Array”。 - yenren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接