如果'nr of elements>如何覆盖cookie中的数组元素X'?

时间:2009-11-28 11:28:09

标签: php cookies

我有一个分类广告网站,当用户点击广告时,包含广告ID的数组元素会设置为Cookie。

然后在主页上显示“上次访问过的广告”。

问题是,我对“上次访问过的广告”(设置为10)的nr有限制。

因此,如果cookie数组包含10个以上的元素,我希望逐个替换元素。

我设法在cookies-array-length > 10后只替换数组中的最后一个元素。但它只会覆盖最后一个元素,当我想要它替换下一个元素时(最后一个)。

实施例: Cookie有10个以上的数组元素。 我点击了一则广告。 然后被替换的ad-id是最后一个元素,总是如此。 但是,我希望它从最后一个开始逐个替换元素。 (nr 10,nr 9,nr 8)这样它就不会一直覆盖nr。

以下是代码:

if (isset($_COOKIE['watched_ads'])){
    $expir = time()+1728000; //20 days
    $ad_arr = unserialize($_COOKIE['watched_ads']);
    $arr_elem = count($ad_arr);
    for ($i=0; $i<$arr_elem; $i++){
        if ($ad_arr[$i] == $ad_id) { $ad_in_cookie_exists = 1; 
        }
    }
    if ($arr_elem>10 && $ad_in_cookie_exists!=1){
        $ad_arr[$arr_elem-1]=$ad_id; // HERE IS THE PROBLEM, IT REPLACES LAST ONE, CANT FIGURE OUT HOW TO REPLACE ONE BY ONE!
        setcookie('watched_ads', serialize($ad_arr), $expir, '/');
    }

    else if ($ad_in_cookie_exists !=1 && $arr_elem<=10){
    $ad_arr[] = $ad_id; echo "andra";
    setcookie('watched_ads', serialize($ad_arr), $expir, '/');
    }
}

那么,您对如何解决这个问题有任何想法吗?

由于

PS:如果您需要更多输入,请告诉我,我会更新Q!

1 个答案:

答案 0 :(得分:0)

为什么不替换最旧的广告点击?因此,不要将其视为[后进先出](http://en.wikipedia.org/wiki/LIFO_(computing))结构,而是将其视为[先进先出](http://en.wikipedia.org/wiki/FIFO_(computing))结构。

查看array_shift()

if (isset($_COOKIE['watched_ads'])){
    $expir = time()+1728000;
    $ad_arr = unserialize($_COOKIE['watched_ads']);
    $arr_elem = count($ad_arr);

    if ( in_array($ad_id) == FALSE ){
        if ( $arr_elem > 10 ){
            $ad_arr = array_shift($ad_arr);
        }
        $ad_arr[] = $ad_id;
        setcookie('watched_ads', serialize($ad_arr), $expir, '/');
    }
}