PHP数组保存到文本文件

11

我已经将外部服务器的响应保存到文本文件中,因此我不需要不断运行连接请求。相反,也许我可以将文本文件用于我的操作目的,直到我准备好重新连接为止。(同时,我的连接请求仅限于这个外部服务器)

这是我保存到文本文件中的内容:

records.txt

Array
(
    [0] => stdClass Object
        (
            [id] => 552
            [date_created] => 2012-02-23 10:30:56
            [date_modified] => 2012-03-09 18:55:26
            [date_deleted] => 2012-03-09 18:55:26
            [first_name] => Test
            [middle_name] => 
            [last_name] => Test
            [home_phone] => (123) 123-1234
            [email] => someemail@somedomain.com
        )
     [1] => stdClass Object
        (
            [id] => 553
            [date_created] => 2012-02-23 10:30:56
            [date_modified] => 2012-03-09 18:55:26
            [date_deleted] => 2012-03-09 18:55:26
            [first_name] => Test
            [middle_name] => 
            [last_name] => Test
            [home_phone] => (325) 558-1234
            [email] => someemail@somedomain.com
        )
)

数组里其实还有更多元素,但我确定选2个就够了。

因为这是一个文本文件,我想假装这是真正的服务器(向我发送相同的信息),那么我怎样才能将它变回真正的数组呢?

我知道我需要先打开这个文件:

<?php
$fp = fopen('records.txt', "r"); // open the file
$theData = fread($fh, filesize('records.txt'));
fclose($fh);
echo $theData;  
?>
到目前为止,$theData是一个字符串值。有没有办法将其转换回最初形式的数组?
所需翻译内容:So far $theData is a string value. Is there a way to convert it back to the Array it originally came in as?
4个回答

31

最好将数组序列化并保存到文件,然后再反序列化回来。

// serialize your input array (say $array)
$serializedData = serialize($array);

// save serialized data in a text file
file_put_contents('your_file_name.txt', $serializedData);

// at a later point, you can convert it back to array like:
$recoveredData = file_get_contents('your_file_name.txt');

// unserializing to get actual array
$recoveredArray = unserialize($recoveredData);

// you can print your array like
print_r($recoveredArray);

嗨,我假设$array已经包含了所有数据,但如果数据一个接一个地到来,那么我将有一堆序列化的数据,当我反序列化文本文件时...它只会反序列化最后一个序列化的数据..我能否将数据反序列化并将其设置为一个数组? - sungchan

4
你不应该以 print_r 格式保存它。
可以使用以下任一方法: 这将使文件解码回数组变得简单。
虽然有一个 print_r 解码器,但这应该是最后的选择,只有在你无法影响输入数据时才需要使用。

1
你确定 var_export() 函数输出的数据可以转换回数组吗?! 顺便提一下,php.net 手册还说了另一个事实:var_export() 无法处理循环引用,因为生成可解析的 PHP 代码几乎是不可能的。如果你想要处理数组或对象的完整表示,可以使用 serialize() 函数。 - rajukoyilandy
@rajukoyilandy:无法序列化或json_encode。循环引用在对象结构中时常见,但在普通数组中不会出现。var_export文件是简单的php片段,可以被常规include()再次包含。应该谨慎使用,但对于配置文件来说非常宝贵。 - mario
var_export与print_r或var_dump相同。 - Sergey
@mario,好的,你是对的。但是为了更好地保存和恢复,请使用序列化/反序列化。 - Sergey
3
我认为json_encode应该排在首位,因为这将使OP能够从PHP和非PHP平台读取数据。 - Salman A
显示剩余2条评论

3
你可以在将数组写入文件之前对其进行序列化。然后,你可以通过从文件中读取数据,并使用unserialize将其转换回数组格式。

2

JSON版本

$json_data = json_encode($the_array);
file_put_contents("records.txt", $json_data);

// Recovering
$the_data = file_get_contents("records.txt");
$the_array = json_decode($the_data);

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