数组键存在但无法从cookie中读取

时间:2013-01-30 17:08:03

标签: php cookies json kohana-3.3

这是一个奇怪的,所以忍受我。问你们真的是我的最后一招。

要说清楚,我正在使用Kohana 3.3,虽然我甚至不确定这与问题有关。

我正在使用Cookie来跟踪网站上的阅读项目。 cookie包含一个json_encoded数组。添加到该数组不是问题,每次读取新项时都会添加对象。数组中的项包含一个带有last_view_dateview_count的对象。为了更新视图计数,我需要检查是否已使用array_key_exists读取了该项目,然后添加到视图计数。以下是我设置cookie的方式:

// Get the array from the cookie.
$cookie_value = Cookie::get_array('read_items');

// Update the view_count based on whether the id exists as a key.
$view_count = (array_key_exists($item->id, $cookie_value)) ? 
                $cookie_value[$item->id]['view_count'] + 1 : 1;

// Create the item to be added to the cookie.
$cookie_item = array(
    'last_view_date' => time(),
    'view_count' => $view_count
);

// Push $cookie_item to the cookie array.
Cookie::push('read_items', $item->id, $cookie_item);

我在Kohana's Cookie classCookie::pushCookie::get_array中添加了两种方法,用于上面的代码:

class Cookie extends Kohana_Cookie {

    public static function push($cookie_name, $key, $value)
    {
        $cookie_value = parent::get($cookie_name);

        // Add an empty array to the cookie if it doesn't exist.
        if(!$cookie_value)
        {
            parent::set($cookie_name, json_encode(array()));
        }
        else
        {
            $cookie_value = (array)json_decode($cookie_value);

            // If $value isn't set, append without key.
            if(isset($value))
            {
                $cookie_value[$key] = $value;
            }
            else
            {
                $cookie_value[] = $key;
            }
            Cookie::set($cookie_name, json_encode($cookie_value));
        }
    }

    public static function get_array($cookie_name)
    {
        return (array)json_decode(parent::get($cookie_name));
    }
}

现在,这是我的问题。在var_dump上运行$cookie_value输出以下内容:

array(1) {
  ["37"]=>
  object(stdClass)#43 (2) {
    ["last_view_date"]=>
    int(1359563215)
    ["view_count"]=>
    int(1)
  }
}

但是当我尝试访问$cookie_value[37]时,我不能:

var_dump(array_key_exists(37, $cookie_value));
// Outputs bool(false);

var_dump(is_array($cookie_value));
// Outputs bool(true);

var_dump(count($cookie_value));
// Outputs int(1);

var_dump(array_keys($cookie_value));
// Outputs:
// array(1) {
//   [0]=>
//   string(2) "37"
// }

添加了调试代码:

var_dump(isset($cookie_value["37"]));
// Outputs bool(false).

var_dump(isset($cookie_value[37]));
// Outputs bool(false).

var_dump(isset($cookie_value[(string)37]));
// Outputs bool(false).

我希望它足够清楚。

2 个答案:

答案 0 :(得分:1)

使用以下方法访问该值: -

$cookie_value["37"]

“37”(键)是字符串格式..您将其指定为整数($ cookie_value [37])

答案 1 :(得分:1)

看看json_decode。目前,您正在将结果转换为数组。如果将第二个参数传递给json_decode,则会得到一个数组而不是stdObject。

问题也可能与您检查int vs string键有关。您可以通过在服务器上运行此代码进行测试:

<?php  

$one = array("37" => "test");
$two = array(37 => "test");

var_dump(array_key_exists(37,$one)); // true or false?
var_dump(array_key_exists(37,$two)); // true

?>