如何将会话内容反序列化成数组

countstars 2006-02-24 10:53:08
比如会话内容
d|i:0;u|i:1;
如何将其转为数组
$session = array("d"=>0,"u"=>1);

非常感谢。
...全文
111 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
countstars 2006-02-26
  • 打赏
  • 举报
回复
上了两个define,补上
define('SESSION_DELIMITER', '|');
define('SESSION_UNDEF_MARKER', '!');
countstars 2006-02-26
  • 打赏
  • 举报
回复
我要从数据库里取会话来分析,所以上面的都不切实际
以下是Justin(http://www.phpsalon.com/)帮我写的程序片段:
function my_session_decode($str) {
$str_len = strlen($str);
$p = 0;
$ret = array();
while ($p < $str_len) {
$q = $p;
while ($str[$q] != SESSION_DELIMITER) {
if (++$q > $str_len) break 2;
}

if ($str[$p] == SESSION_UNDEF_MARKER) {
$p++;
$has_value = false;
} else {
$has_value = true;
}
$key_len = $q - $p;
$key = substr($str, $p, $key_len);
$q++;
if ($has_value) {
$type = substr($str, $q, 1);
$value = @unserialize(substr($str, $q, $str_len));
if ($value !== FALSE) {
switch ($type) {
case 'i':
// integer
$q += strlen(strval($value)) + 3;
break;
case 's':
// string
$q += strlen(strval(strlen($value))) + 6 + strlen($value);
break;
case 'a':
// array
break;
case 'b':
// boolean
break;
case 'o':
// object
break;
case 'r':
// resource
break;
case 'd':
// double
break;
}
$ret[$key] = $value;
}

} else {
$ret[$key] = '';
}
$p = $q;
}
return $ret;
}
xuzuning 2006-02-24
  • 打赏
  • 举报
回复
还是这样比较稳妥

print_r(foo('d|i:0;u|i:1;'));

function foo($s) {
if(! isset($_SESSION)) {
@session_start();
}
$t = $_SESSION;
session_decode($s);
list($t, $_SESSION) = array($_SESSION, $t);
return $t;
}

xuzuning 2006-02-24
  • 打赏
  • 举报
回复
$ar = explode(';', 'd|i:0;u|i:1;');

foreach($ar as $v) {
if($v) {
list($k, $v) = explode('|', $v.';');
$p[$k] = unserialize($v);
}
}
print_r($p);

这只是测试例,当值中出现“;”就有问题了

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧