PHP:将最后查看的项目存储在会话数组中

时间:2011-05-14 08:34:37

标签: php arrays session

我有一个简单的功能: 1)用户查看一些图像,image_id存储在会话数组中 2)然后用户可以看到最近10个已查看的图像

目前我的功能是:

function lastSeen($image_id){
    if(!isset($_SESSION['lastSeen'])){
        $_SESSION['lastSeen'] = array($image_id);
    }else{
        $tmpSession = array_unique($_SESSION['lastSeen']);
        if(count($tmpSession) > 9){
            $tmpSession = array_slice($tmpSession,1);
        }
        $tmpSession[] = $image_id;
        $_SESSION['lastSeen'] = array_unique($tmpSession);
    }
    return true;
}

此功能有效但问题是,如果用户多次查看一个图像,则会话中仅保存9个项目。 任何人都可以帮我解决这个问题吗?也许整个功能需要重写它......

4 个答案:

答案 0 :(得分:1)

如果你不介意图像的顺序没有改变,当用户两次观看一个图像时,我会选择这个简单的解决方案。只需添加如下行:

if (in_array($image_id, $tmpSession)) return true;

所以你的功能看起来像这样:

function lastSeen($image_id){
    if(!isset($_SESSION['lastSeen'])){
        $_SESSION['lastSeen'] = array($image_id);
    } elseif (in_array($image_id, $_SESSION['lastSeen'])) {
       return true;
    } else {
        $tmpSession = array_unique($_SESSION['lastSeen']);
        if(count($tmpSession) > 9){
            $tmpSession = array_slice($tmpSession,1);
        }
        $tmpSession[] = $image_id;
        $_SESSION['lastSeen'] = array_unique($tmpSession);
    }
    return true;
}

答案 1 :(得分:1)

您可能希望删除多余的条目作为最后一件事,并且只有当它超过10个条目时才会删除:

else {
   $tmpSession = $_SESSION['lastSeen'];
   $tmpSession[] = $image_id;  
   $tmpSession = array_unique($tmpSession);

   if(count($tmpSession) > 10){
       $tmpSession = array_slice($tmpSession,1);
   }
   $_SESSION['lastSeen'] = $tmpSession;
}

答案 2 :(得分:1)

您的函数的另一个实现可能是:

function lastSeen($image_id){
     if(!isset($_SESSION['lastSeen']) || !is_array($_SESSION['lastSeen'])){
          $_SESSION['lastSeen'] = array();
     }

     if(!in_array($image_id, $_SESSION['lastSeen']){
          array_push($_SESSION['lastSeen'], $image_id);
     }

     if(sizeof($_SESSION['lastSeen']) > 10){
          array_shift($_SESSION['lastSeen']);
     }
}

答案 3 :(得分:0)

如果您想要一个将最后访问过的图像存储为数组中最后一个项目的函数,那么只需替换:

$tmpSession = array_slice($tmpSession,1);

使用以下行:

if (in_array($image_id,$tmpSession))
    array_splice($tmpSession, array_search($image_id, $tmpSession), 1);
else
    $tmpSession = array_slice($tmpSession, 1);

结果函数如下所示:

function lastSeen($image_id) {
if (!isset($_SESSION['lastSeen'])) {
    $_SESSION['lastSeen'] = array($image_id);
} else {
    $tmpSession = array_unique($_SESSION['lastSeen']);
    if (count($tmpSession) > 9){
        if (in_array($image_id,$tmpSession))
            array_splice($tmpSession, array_search($image_id, $tmpSession), 1);
        else
            $tmpSession = array_slice($tmpSession, 1);
    }
    $tmpSession[] = $image_id;
    $_SESSION['lastSeen'] = array_unique($tmpSession);
}
return true;

}