44

我有一个代码,每次访问页面时都会向数组添加一个数字。这些数字存储在 cookie 中,稍后检索。

我想只保留数组中最近的 5 个数字。

如果数组已满(5 个项目)并且必须添加一个新数字,则必须删除最旧的数字并保留最新的项目

这就是我所拥有的:

    $lastviewedarticles = array();

if (isset($_COOKIE["viewed_articles"]) ) {
  $lastviewedarticles = unserialize($_COOKIE["viewed_articles"]);
}

if (!in_array($articleid, $lastviewedarticles)){
    $lastviewedarticles[] = $articleid;
}
setcookie("viewed_articles", serialize($lastviewedarticles));
4

4 回答 4

222

array_slice返回数组的切片

array_slice($array, 0, 5) // return the first five elements
于 2013-03-07T07:50:28.197 回答
9

使用 array_splice 和 array_unique 获得 5 个唯一的数组值

array_splice(array_unique($lastviewedarticles), 0, 5);
于 2013-03-07T07:52:01.040 回答
8

首先我认为,您需要获取数组长度,然后如果长度>或等于5,则删除第一个元素,并将元素添加到数组的末尾。

if (!in_array($articleid, $lastviewedarticles)){
    $count = count($lastviewedarticles);
    if($count>=5)
        array_shift($lastviewedarticles);
    $lastviewedarticles[] = $articleid;
}
于 2013-03-07T07:53:30.440 回答
0

使用计数器访问数组,在每次调用中递增它并使用模运算写入数组。如果您的计数器必须持续多次调用,您必须将其存储在会话变量或 cookie 中。

假设 $i 持有你的计数器变量,这看起来像

if (!in_array($articleid, $lastviewedarticles)){
   $lastviewedarticles[$i%5] = $articleid;
   $i++;
}

结果是一个原始的环形缓冲区,它将始终包含最后 5 个值。

于 2013-03-07T07:51:49.460 回答