Я не вижу никакого способа сделать это фиксированным количеством времени или пространства, оба будут увеличиваться с размером списка.
Я бы использовал IdentityHashMap (учитывая, что нет но IdentityHashSet) и хранить каждый узел в карте. Прежде чем узел будет сохранен, вы вызовете containsKey на нем. Если узел уже существует, у вас есть цикл.
ItentityHashMap использует == вместо .equals, чтобы вы проверяли, где находится объект в памяти, а не в том же содержимом.
Не могли бы вы просто сделать
if (Session::has('your_key'))
{
//your code here
}
Определение наличия элемента в сеансе
Чтобы определить, есть ли элемент присутствует в сеансе, вы можете использовать метод has. Метод has возвращает true, если элемент присутствует и не равен нулю:
if ($request->session()->has('users')) {
//
}
Чтобы определить, присутствует ли элемент в сеансе, даже если его значение равно null
, вы можете использовать [114 ] метод. Метод exist возвращает true, если элемент присутствует:
if ($request->session()->exists('users')) {
//
}
Я предполагаю, что вы хотите проверить, просматривал ли посетитель определенное сообщение в блоге, и в этом случае я бы, вероятно, сделал что-то подобное.
$currentPost = Post::where('slug', $slug)->first();
// You should also probably set up your relationship with Comments
$comments = \App\Comment::where('post_id', $currentPost->id)->get();
if(! in_array($currentPost->id, session()->get('posts_viewed', []))) {
session()->push('posts_viewed', $currentPost->id);
// Your increment could also be simplified as follows
$currentPost->increment('view_count');
}
В вашем конкретном случае вы сможете только отслеживать, просматривал ли пользователь один конкретный пост в блоге. Однако, если вы используете массив и продолжаете загружать в него просмотренные записи блога, вы сможете отслеживать просмотры многих постов блога.