PHP: хранить последние просмотренные элементы в массиве сессии - PullRequest
1 голос
/ 14 мая 2011

У меня есть простая функция, которая делает это: 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 ]

1 голос
/ 14 мая 2011

Вы, вероятно, хотите удалить посторонние записи как самое последнее, а также только если это больше 10 записей:

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

   if(count($tmpSession) > 10){
       $tmpSession = array_slice($tmpSession,1);
   }
   $_SESSION['lastSeen'] = $tmpSession;
}
1 голос
/ 14 мая 2011

Другая реализация вашей функции может быть:

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']);
     }
}
1 голос
/ 14 мая 2011

Если вы не возражаете, что порядок изображений не меняется, когда пользователь просматривает одно изображение дважды, я бы выбрал это простое решение.Просто добавьте строку так:

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;
}
0 голосов
/ 14 мая 2011

Если вы хотите, чтобы функция сохраняла последнее посещенное изображение как последний элемент в массиве, просто замените:

$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;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...