$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);这只是测试例,当值中出现“;”就有问题了

解决方案 »

  1.   

    还是这样比较稳妥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;
    }
      

  2.   

    我要从数据库里取会话来分析,所以上面的都不切实际
    以下是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;
    }
      

  3.   

    上了两个define,补上
    define('SESSION_DELIMITER', '|');
    define('SESSION_UNDEF_MARKER', '!');