【问题标题】:convert array to string and get it back to array in PHP将数组转换为字符串并将其返回到 PHP 中的数组
【发布时间】:2014-10-19 11:26:05
【问题描述】:

我正在使用 Serialize 函数在我的 MYSQL 数据库中存储一个数组,然后我在其他页面中取消序列化他。 数组结构如下所示:

Array ( [0] => Array ( [names] => somename1 [rating] => 10 ) [1] => Array ( [names] => somename2 [rating] => 9 ) )

当我将数组插入数据库时​​,我正在使用此函数将其转换为字符串:

$array_string=mysql_escape_string(serialize($arr));

然后,当我进行反序列化时,我不知道如何将字符串(数据库中的数组)恢复到原来的结构。 (如何将此字符串转换回数组)

我知道我必须使用这条线:

$arr=explode("|",$list);

在某种程度上,但我无法将它恢复到之前的数组结构。 这行的结果在数组的结构上有点不同:

Array ( [0] => Array( [0] => Array ( [names] => d [rating] => 7 ) [1] => Array ( [names] => b [rating] => 6 )  ) )

谢谢

【问题讨论】:

  • 如果你知道serialize,为什么你不知道unserialize
  • @sectus +1。 unserialize() 会将其转换回序列化字符串。
  • @sectus - 我的问题是将其从序列化字符串转换回数组。我提到过。
  • @DavidAlexandrovich,那你的问题是什么?您是否尝试使用反序列化?
  • @DavidAlexandrovich 您使用 unserialize() 将序列化的字符串转换为数组。这里不需要explode()。

标签: php arrays string


【解决方案1】:

序列化的反义词是unserialize

$old_array = unserialize($serialized_array_string_from_db);

将序列化的值存储到数据库中,不允许单独查询它们。 您必须获取序列化的值,取消序列化,然后您才能开始使用它们。 从数据库设计的角度来看,这不是很有效。我的建议是在额外的表格中为“名称”和“评级”创建单独的字段。


将数组序列化到数据库

$array = array('names' => 'somename1', 'rating' => 10);
$array_serialized_to_string = serialize($array);
doStoreToDb($array_serialized_to_string, somewhere);

从数据库中获取序列化数组

$array_serialized_to_string = doFetchFromDb(somewhere);
$array = unserialize($array_serialized_to_string);

数组结构的不同可能是查询“返回集为数组”的结果。 只需删除外部数组:

$old_array = unserialize($serialized_array_string_from_db);
$array = $old_array[0];

【讨论】:

  • 这不是我的问题,我已突出显示(粗体)问题。
  • 你说得对,我必须替换 $array = $old_array[0];像这样,但我认为我没有很好地解释自己。
  • 问题是 - 当我试图获得“echo $arr[0]['names'];”例如,我收到警告:“bla bla bla 中的非法字符串偏移 'names'..” 我认为问题在于 $array 未被识别为数组。因为当我在做“echo $arr;”时它像 print_r() 函数一样打印 arr 。我认为它会将其识别为字符串。
  • 好的,我想我们找到了! :) 你的数组不再是一个数组,而是一个字符串,因为 print_r ... print_r 给了你一个字符串。那么你正在再次序列化字符串..
  • 将字符串从 print_r() 转回数组有点复杂,但有可能,请参阅 stackoverflow.com/questions/7231763/… 。一般来说,最好使用 var_export($array, true),因为变量很容易通过简单的赋值转换回来。 - <?php print_r($arr); ?> 这段代码需要修改。如果你只是在这里删除 print_r,表单内容看起来很难看,但是序列化到数组应该开始工作......
【解决方案2】:

试试json_encodejson_decode

$array_to_store = array(....);
$str_array = json_encode($array_to_store);
//Store $str_array
//Retrieve it and to make it an array again
$array = json_decode($str_array, true);

******************* Edited *********************

我看不出序列化和反序列化有什么问题:

$array = array(
        array(
                'names' => 'somename1',
                'rating' => 10
             ),
        array(
                'names' => 'somename2',
                'rating' => 9
             )
    );

//Array before
print_r('<pre>');
print_r($array);

//Serialised Array
$s = serialize($array);

print_r('<pre>');
print_r($s);

//Unserialised Array
print_r('<pre>');
print_r(unserialize($s));

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 2013-05-12
    • 1970-01-01
    • 2020-09-04
    • 2010-10-15
    • 1970-01-01
    • 2015-03-09
    • 2014-02-21
    • 2019-04-24
    相关资源
    最近更新 更多