【问题标题】:Adding an key to a existing (or not) array向现有(或不)数组添加键
【发布时间】:2011-10-07 19:15:21
【问题描述】:

我得到了这个代码:

if( empty ($cache[$id]) ) {
    $arr[$id] = @TIMENOW;
    setcookie('id', cArr($arr, 'set'), -1, @PATH);
} else {
    $cache[$id] = @TIMENOW;
    setcookie('id', cArr($cache, 'set'), -1, @PATH);
}

它只向cookie 添加一个键,如果我转到另一个线程,它将重置数组,并且不会添加更多键。我的意思是,如果用户使用id 1 进入线程,那么if( empty ($cache[1]) ) 会加1,而不是更新现有值,并且如果用户现在进入ID 5 的线程,它也会这样做,并且 if( empty ($cache[5]) ) 为空,然后它将 ID 为 5 的键添加到数组中,因此我现在将拥有两个键:1 和 5。

希望你明白了。如果你不这样做,请随时询问你想要的任何东西,我会回答你所有的问题。

【问题讨论】:

  • @TIMENOW@PATH 中的错误抑制 @ 是怎么回事?如果未定义相应的常量,您是否暗示 "TIMENOW""PATH" 是有效值?
  • 显示 cArr() 函数,这是您的问题的一部分。
  • @mario 这不是我的问题,请再看一遍问题,我只是不想添加另一个数组键,cArr 只是用于序列化数组...跨度>
  • @BoltClock 你在说什么?添加了 Cookie - 所以 PATH 已定义,即使 TIMENOW 未定义(但已定义),它也会添加一个带有 $id 键的空数组。
  • @Lucas:如果保证定义常量,则不需要@s,并且如果未定义常量,则使用的默认值是其字符串名称,而不是NULL .如果您想将@ 用作常量的标志(例如$ 用于变量)...不要。

标签: php arrays key


【解决方案1】:

cArr() 中了解您在做什么会很有帮助。但如果没有它,这将为用户访问的每个新线程添加到您的 cookie。

//get previous values
$id = $_GET['thread_id'];
$cache = array_key_exists('id', $_COOKIE) ? unserialize($_COOKIE['id']) : array();

//add to $cache
$cache[$id] = TIMENOW;
setcookie('id', serialize(cArr($cache, 'set')), -1, PATH);

警告:但请记住,只需设置一个 cookie,您的网络服务器就可以被利用。所以最好不要使用searializeunserialize 在cookie 中存储简单的静态值。

【讨论】:

  • 我认为cArr() 所做的一切都包括序列化。
  • cArr,正在序列化数组 - 如果没有 'set' 参数,它将改为反序列化。但是让我们谈谈你的答案:有一个名为$_COOKIE['threads_last'] 的cookie,当它包含一个数组时:array(123 => 138745690); 其中123 是线程ID,值是unix 时间戳。现在,如果我不想进入另一个线程,这个数组就会被覆盖,而不是向数组添加另一个键。希望你现在明白我的问题:)。非常感谢您的回答!我投了赞成票!
  • 你可能是对的,但是因为我看不到它,所以我想确保读者知道它需要被序列化。
  • @Lucas - 那是因为您似乎正在使用第一个分支创建一个新数组(当值为 empty() 时)。您确实需要将其添加到从 cookie 构建的 $cache 数组中,而不是像您的示例中那样创建新的 $arr 。这就是这个答案所证明的。
  • 请看这里:pastebin.com/91Y7MXW2 我已经解释了很多,也请阅读 cmets。
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多