在字符串中使用explode函数与变量?

3
我有一个以$post_id为键的数组。当保存数据时,我将其保存为字符串:
foreach( $data as $post_id => $details )
  $string .= "-pid-$post_id-$details";

在使用数据时,我需要将其转换回以$post_id为键和$details为值的数组。当我不知道$post_id是什么时,该如何处理它?


1
只需在"-pid-"上使用explode函数吗? - Bergi
4个回答

5

不要这样做。如果您需要序列化一个字符串,请使用json_encode()函数:

$string = json_encode($data);

然后,当您需要再次解码时:
$data = json_decode($string);

简单又安全。

以下是PHP参考文档:json_encode()


3

PHP有一个名为serialize的方法,它可以将数组(如$_POST)转换为字符串,然后可以使用unserialize将其重新创建为数组。

<?php
    // $_POST looks like this for example:
    // $_POST['value'] = 100;
    $string = serialize($_POST);
    echo $string; // Prints '"a":1:{s:5:"value";s:3:"100";}'
    $data = unserialze($string);
    print_r($data); // Prints Array[0] ( 'value' => '100' )
?>

我不会强调关于未对用户输入进行消毒的问题,但是请对用户输入进行消毒。

serialize

unserialize

请注意,这是一个二进制字符串,可能包含空字节,并且需要按此方式存储和处理。例如,serialize() 的输出通常应存储在数据库的 BLOB 字段中,而不是 CHAR 或 TEXT 字段。 -- 来自 php 文档


serialize() 会生成一个二进制字符串,其中可能包含空字节和其他内容。在需要使用 JSON 字符串的地方,它不一定安全。 - user1864610
@MikeW在答案中添加了一条注释。 - Brombomb

2
您需要使用explode函数将字符串拆分,使用方法如下:
explode ( string $delimiter , string $string [, int $limit ] )
这将返回一个数组,其中包含您的数据。
例如:
foreach($data AS $post_id => $details) {
  $string .= "|||$post_id||$details"
}

然后要从字符串中获取您的数据。
    $newArray = explode('|||', $string);

foreach($newArray AS $key=>$val){
   $holding = explode('||', $val);
   $finalArray[$holding[0]] = $val;
}

现在您将拥有一个数组,其中键是id,值是字符串中每个项目的详细信息。
编辑:
或者像Brombomb建议的那样使用serialize和unserialize。

1
如果我理解你的问题...
$temp = explode('-pid-', $string);
array_shift($temp);

foreach ($temp as $item) {
    list($post_id, $value) = explode('-', $item);
    $data[$post_id] = $value;
}

json_encode和相关的json_decode可能是在第一时间对数据进行"字符串化"的更好选择。但是,你选择的方式可能有合理的原因。


如果 post_id 中有 - 怎么办? - Brombomb
那你就很麻烦了,因为没有其他的分隔符可供使用。 - Herbert

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