PHP - 如何在数组中保留最后十个东西?

时间:2012-01-17 05:21:23

标签: php arrays

我正在使用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
        )

)

期望的行为:

  • 最后10个帖子ID将保留在一个数组中
  • 如果已访问的帖子已经在数组中,它将移动到数组的开头或结尾
  • 如果数组的大小为10个元素,并且访问了新的第11个帖子,则会删除最旧的帖子ID并添加新帖子ID

我不太关心新帖子在阵列的哪一侧(开始或结束),只要它是一致的。我真的不在乎数组键是什么。

实现这一目标的最佳方法是什么?

我尝试搜索类似的问题,但没有提出任何有用的信息,所以如果这是一个骗局我道歉。

4 个答案:

答案 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;