我正在使用PHP,我试图通过$_SESSION
数组保留Wordpress中最后10个帖子ID的数组。我知道我可以像这样添加最新的帖子ID:
$_SESSION['recently_viewed_posts'][] = $post->ID;
同样地,我可能会用这样的命令来删除大于10的那些命令:
if( sizeof( $_SESSION['recently_viewed_posts'] ) > 10 )
{
array_shift( $_SESSION['recently_viewed_posts'] );
}
然而,如果用户重新加载相同的帖子几次,这将无法正常工作,您最终可能会遇到以下情况:
Array
(
[recently_viewed_posts] => Array
(
[0] => 456
[1] => 456
)
)
期望的行为:
我不太关心新帖子在阵列的哪一侧(开始或结束),只要它是一致的。我真的不在乎数组键是什么。
实现这一目标的最佳方法是什么?
我尝试搜索类似的问题,但没有提出任何有用的信息,所以如果这是一个骗局我道歉。
答案 0 :(得分:1)
使用$post->ID
作为键会使事情变得更简单。
if (sizeof( $_SESSION['recently_viewed_posts'] ) >= 10) {
array_shift($_SESSION['recently_viewed_posts']);
}
if (isset($_SESSION['recently_viewed_posts'][$post->ID])) {
unset($_SESSION['recently_viewed_posts'][$post->ID]);
}
$_SESSION['recently_viewed_posts'][$post->ID] = 1;
然后array_keys($_SESSION['recently_viewed_posts'])
会给你结果。
答案 1 :(得分:1)
if (!isset($_SESSION['recently_viewed_posts'])) {
$_SESSION['recently_viewed_posts'] = array();
}
array_unshift($_SESSION['recently_viewed_posts'], $post->ID);
$_SESSION['recently_viewed_posts'] =
array_slice(array_unique($_SESSION['recently_viewed_posts']), 0, 10);
这会将新条目推送到数组的开头,使用array_unique
(保留第一个项目)来清除重复项,并将数组限制为10个条目。最近的帖子将在$_SESSION['recently_viewed_posts'][0]
。
答案 2 :(得分:0)
尝试这样的事情(未经测试,只是逻辑)
function addNew($new,$array)
{
if(!in_array($new,$array))
{
if(sizeof($array) < 10){
array_push($array,$new);
}
else{
array_shift($array);
addNew($new,$array);
}
}
addNew($post->ID,$_SESSION['recently_viewed_posts'])
答案 3 :(得分:0)
# Get the Existing Post History, if there is one, or an empty array
$postHistory = ( isset( $_SESSION['recently_viewed_posts'] ) ? $_SESSION['recently_viewed_posts'] : array() );
# Remove prior visits
if( $oldKey = array_search( $post->ID , $postHistory ) )
unset( $postHistory[$oldKey] );
# Add the Post ID to the end of it
$postHistory[] = $post->ID;
# Trim the array down to the latest 10 entries
$postHistory = array_values( array_slice( $postHistory , -10 ) );
# Return the value into the Session Variable
$_SESSION['recently_viewed_posts'] = $postHistory;