Функция array_pop выскакивает два элемента массива - PullRequest
0 голосов
/ 08 мая 2018

Ничего плохого в коде, он работает нормально, но на некоторых шаблонах нет.

Вот как это работает:

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

Проблема здесь, в некоторых шаблонах функция array_pop выскакивает 2 элемента массива при перезагрузке страницы (включенный шаблон + другой).

Я пытался удалить код из «проблемных» шаблонов, но не могу найти решение.

Мне нужна помощь, чтобы определить эту проблему.

session_start();
$templates = array("t1.php","t2.php","t3.php"); #list of templates paths

if (!isset($_SESSION['templates']) || empty($_SESSION['templates'])) {
    shuffle($templates); #shuffle them 
    $_SESSION['templates'] = $templates; #store them in sesssion
}

$currentTemplate = array_pop($_SESSION['templates']); #pops one on each page reload

include $currentTemplate; #includes the next template of the array
#on each page reload an element will be popped out and the next one will    be included, the issue, is that sometimes two elements-templates are popped out of the array.

Я обнаружил, что он выталкивает два элемента в следующем коде:

    foreach($_SESSION['templates']  as $key=>$value)
        {
 echo 'The value of session['."'".$key."'".'] is '."'".$value."'".' <br />';
        }

Не перезагрузить

Значение сеанса ['0'] равно 't3.php'

Значение сеанса ['1'] равно 't2.php'

Перезагрузка 1:

На некоторых шаблонах мой код работает нормально, повторяю. Я не знаю, что происходит:)

1 Ответ

0 голосов
/ 08 мая 2018

Редактировать # 3 - После обсуждения в автономном режиме

Оказывается, JS инициировал 2-й запрос (в фоновом режиме) к сценарию PHP, который уменьшал количество хранимых шаблонов в сеансе.

В частности, это был preloader , который зацикливался на изображениях, которые инициировали дополнительный запрос к index.php.

img = document.images;
jax = img.length;

for(var i=0; i<jax; i++) {
    console.log(img[i].src);
} 

11: 38: 39.711 VM322: 5 http://plrtesting.herokuapp.com/index.php ** Этот

11: 38: 39,711 VM322: 5 https://i.imgur.com/gu9bfbD.gif

Конец редактирования

Код делает именно то, что вы говорите.

$currentTemplate = array_pop($_SESSION['templates']);

Вы удаляете , не извлекая конечный элемент и присваивая его своей переменной. Каждый раз, когда вы перезагружаете страницу, это popping 1 элемент массива. Вот почему вы видите, что это уменьшается со временем.

Вам нужно получить вместо этого. Если вы хотите последний элемент, то:

session_start();
$templates = array("t1.php","t2.php","t3.php"); #list of templates paths

if (!isset($_SESSION['templates']) || empty($_SESSION['templates'])) {
    shuffle($templates); #shuffle them 
    $_SESSION['templates'] = $templates; #store them in sesssion
}

$currentTemplate = end((array_values($_SESSION['templates'])));

Редактировать # 1 - сделать так, чтобы он перетасовывался при каждой загрузке страницы

Обратите внимание, что существует несколько способов рандомизации шаблона. Взгляните на это так - Получить случайный элемент из массива .

session_start();
$templates = array("t1.php","t2.php","t3.php"); #list of templates paths

// Commented out the if statement so it shuffles on each page load.
//if (!isset($_SESSION['templates']) || empty($_SESSION['templates'])) {
shuffle($templates); #shuffle them
$_SESSION['templates'] = $templates; #store them in sesssion
//}

$currentTemplate = end((array_values($_SESSION['templates'])));

var_dump($currentTemplate);

РЕДАКТИРОВАТЬ # 2 - Не уверен, ясно это или нет, но ваш код зацикливается на оставшихся элементах; не всплывающий элемент.

...