2012-01-17 3 views
0

Я использую PHP, и я пытаюсь сохранить массив последних 10 сообщений в Wordpress через массив $_SESSION. Я знаю, что могу добавить к последнему сообщению идентификатор так:PHP - как сохранить последнюю десятку в массиве?

$_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 почтовые идентификаторы будут иметь в массиве
  • Если посещаемой пост уже в массиве, он будет двигаться в начало или конец массива
  • Если размер массива 10 элементов, а также новый 11-й пост, будет удален старый идентификатор сообщения и добавлен новый идентификатор сообщения

Меня не волнует, какая сторона массива (начало или конец) новая сообщения продолжаются, если они согласуются. Мне все равно, какие ключи массива.

Каков наилучший способ для этого?

Я пробовал искать похожие вопросы, но не придумал ничего полезного, поэтому прошу прощения, если это обман.

ответ

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].

+0

Я просто думал о подобном :) +1 – diEcho

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']) даст вам результат.

+0

я думаю, что использование целого в качестве ключа массива не будет сохранять порядок – cwd

+0

Вы пробовали :) – xdazz

+0

вау, ты правильно. это работало по-разному в php4? по какой-то причине я подумал, что если вы использовали числовой ключ и сделали print_r, он будет выводиться в числовом порядке. думаю, я был неправ. благодаря! – cwd

0

TRY что-то вроде этого (не проверял, только логика)

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']) 
+1

Это не перемещает повторяющиеся записи в начало массива. Более практично это не работает, потому что вы не передаете массив по ссылке. – deceze

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; 
+1

Вы можете просто сделать 'array_slice ($ array, -10)' вместо двойного обратного. Это также не учитывает повторяющиеся записи. – deceze

+0

@deceze: Справедливая точка. Я пробовал проверить, что с помощью онлайн-песочницы PHP php, но он не вел себя так, как я ожидал. (Это была моя первая мысль.) И согласилась - не охватывала экземпляры дубликатов.Исправлено это. –

Смежные вопросы