【问题标题】:reading a php array saved in a file?读取保存在文件中的 php 数组?
【发布时间】:2011-02-14 20:58:10
【问题描述】:

我有一些 php 数组保存在 .log 文件中

我想将它们读入一个 php 数组,例如

array[0] = .log 文件中的第一个数组 array1 = .log 文件中的第二个数组

解决方案here 对我不起作用

它没有给出这样的文件或目录错误,但是当我执行 include_once('file.log') 时,文件中的内容显示为输出(我不知道为什么)请帮助

【问题讨论】:

  • 请举例说明数组存储在文件中的格式,以便我们知道它们是否可以读回 PHP。
  • @gordon,你用过 print_r 吗?就是这样的格式,实际上数据是私人的paypal相关数据,所以我不能发布。
  • @shaheer 你能改变文件的存储格式吗?您可以改用链接副本中建议的任何格式吗?那么你就没有任何问题了。
  • 我不能,因为它需要大量编码并且会减慢我的脚本我正在使用 chris 的解决方案,这工作正常

标签: php file-io


【解决方案1】:

在将数组作为文本写入文件之前,您可以serialize 数组。然后,您可以从文件中读回数据,unserialize 会将其转回数组。

http://php.net/manual/en/function.serialize.php

EDIT描述使用序列化/反序列化的过程:

所以你有一个数组:

$arr = array(
  'one'=>array(
      'subdata1',
      'subdata2'
  ),
  'two'='12345'
);

当我在该数组上调用 serialize 时,我得到一个字符串:

$string = serialize($arr);
echo $string;

OUTPUT: a:2:{s:3:"one";a:2:{i:0;s:8:"subdata1";i:1;s:8:"subdata2";}s:3:"two";s:5:"12345";}

所以我想将该数据写入文件:

$fn= "serialtest.txt";
$fh = fopen($fn, 'w');
fwrite($fh, $string);
fclose($fh);

稍后,我想使用该数组。所以,我会读取文件,然后反序列化:

$str = file_get_contents('serialtest.txt');
$arr = unserialize($str);
print_r($arr);

OUTPUT: Array ( [one] => Array ( [0] => subdata1 [1] => subdata2 ) [two] => 12345 ) 

希望有帮助!

EDIT 2嵌套演示

要随着时间的推移将更多数组存储到此文件中,您必须创建一个父数组。这个数组是所有数据的容器,所以当你想添加另一个数组时,你必须解包父数组,然后将新数据添加到其中,然后重新打包整个东西。

首先,设置您的容器:

// Do this the first time, just to create the parent container
$parent = array();
$string = serialize($arr);
$fn= "logdata.log";
$fh = fopen($fn, 'w');
fwrite($fh, $string);
fclose($fh);

现在,从那里开始,当你想添加一个新数组时,首先你必须取出整个包并反序列化它:

// get out the parent container
$parent = unserialize(file_get_contents('logdata.log'));

// now add your new data
$parent[] = array(
  'this'=>'is',
  'a'=>'new',
  'array'=>'for',
  'the'=>'log'
);

// now pack it up again
$fh = fopen('logdata.log', 'w');
fwrite($fh, serialize($parent));
fclose($fh);

【讨论】:

  • 在那之后我将如何阅读它?目前 var_dump( 反序列化 ($str ) );给出布尔(假)
  • 哦,我想我误解了你的问题。现在我突然想到你在一个文本文件中有 EXISTING 数组,而你只是想把它们当作一次性的东西来阅读。对吗?
  • 迂腐提示:答案中的 should 应该变成 could,因为还有很多其他方法(其中一些 may根据用例更好)...
  • @chris 是的,尽管我现在使用序列化来写入数据,但您是对的,除了一种情况外,您的解决方案工作正常。它只读取一个数组,我怎样才能读取所有数组?
  • 如果您要将多个数组打包到文件中,那么您将使用数组嵌套。我会更新我的答案给你看。 :)
【解决方案2】:

实际上需要 2 行代码($ar 是数组,$filename 是要保存的路径+文件名):

保存数组:

file_put_contents($filename, serialize($ar));

读回数组:

$ar=unserialize(file_get_contents($filename));

【讨论】:

    【解决方案3】:

    include_once 显示输出,所以这并不意外。能否提供一下文件格式?

    您可以使用 file_get_contents('file.log') 获取文件的内容,然后轻松地将其放入数组中(例如使用 preg_split)。

    【讨论】:

    • 这应该是评论吗?哦,对了,你需要积分来评论,不是吗?我的错!
    • file_get_contents('file.log') 给出文件或目录未找到错误,我在描述中说过
    • include_once 显示输出?有趣的。请向php.net/manual/en/function.include-once.php 提交错误报告并告知他们,因为文档建议不同。
    • 该文件不是php文件,所以可能没问题?
    • 感谢 Gordon 的讽刺,但是 include 函数会输出不在代码标签之间的所有内容,当它是日志文件而不是 php 文件时,通常是整个文件。有意义吗?
    【解决方案4】:

    您需要“返回”数组,打开日志 file.log 并在顶部添加 return

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多