Я произвольно выбираю шаблоны php, чтобы включить их на веб-страницу. Каждый раз, когда пользователь перезагружает веб-страницу, будет появляться новый случайный шаблон.
Проблема с array_rand: он возвращает одну случайную строку каждый раз, когда пользователь перезагружает веб-страницу, и один и тот же шаблон может отображаться снова и снова.
Например, предположим, что пользователь перезагружает страницу 3 раза. Он может получить следующие шаблоны:
template1.php, template1.php, template2.php
Я хочу, чтобы пользователь видел все шаблоны в случайном порядке. Например,
template3.php,template2.php,template1.php
$items = array("template1.php","template2.php","template3.php"); #templates array
$a = $items[array_rand($items,1)]; #randomize templates
include $a; #including randomized template
или, может быть, перетасовать шаблоны и сохранить их все в сеансе?
"все шаблоны в случайном порядке" - точное определение тасовать ;-) Но вы должны решить, что вы хотите, чтобы произошло, когда у вас закончатся шаблоны.
Shuffle все еще может показывать предыдущую страницу, прочтите OP, ребята
@pokeybit Да, я редактировал это в своем комментарии.
Когда у меня заканчиваются шаблоны, я снова хочу перемешать
Да, но нормально ли, что последний шаблон в каждом запуске становится первым шаблоном при следующем запуске?
Нет, просто перемешай их






Вы можете использовать оператор in if в сочетании с переменной $ _SESSION [] для сохранения предыдущей страницы и исключения предыдущей страницы из массива перед вызовом вашей процедуры rand
session_start();
$items = array("template1.php","template2.php","template3.php");
if (($key = array_search($_SESSION['last_page'], $items)) !== false) {
unset($items [$key]);
} //taken from https://stackoverflow.com/questions/7225070/php-array-delete-by-value-not-key
$a = $items[array_rand($items,1)];
$_SESSION['last_page'] = $a;
include $a;
Чтобы убедиться, что все страницы посещены хотя бы один раз перед сбросом массива, используйте ответ @Philipp Maurer ниже / выше
Я пробовал ваш код, но получаю те же шаблоны, прежде чем их все вижу. Это не работает должным образом.
Чтобы это работало, вам нужно сохранить, какие шаблоны уже загружены посетителем. Это можно сохранить в сеансе, например:
//At the beginning of your script
session_start();
//... Some code
//Read visited paths from session or create a new list.
//?? works only in PHP7+. Use isset()?: instead of ?? for previous versions
$visitedTemplates = $_SESSION['visitedTemplates'] ?? [];
//Your list, just slightly changed syntax. Same thing
$originalList = [
"template1.php",
"template2.php",
"template3.php"
];
//Remove all paths that were already visited from the randomList
$randomList = array_diff($originalList, $visitedTemplates);
//You need to check now if there are paths left
if (empty($randomList)) {
//The user did load all templates
//So first you set the list to choose a new template from to the list of all templates
$randomList = $originalList;
//And then you delete the cache of the visited templates
$visitedTemplates = [];
}
//Show the user the next one
$randomTemplate = $randomList[array_rand($randomList)];
include $randomTemplate;
//Now we need to save, that the user loaded this template
$visitedTemplates[] = $randomTemplate;
//And we need to save the new list in the session
$_SESSION['visitedTemplates'] = $visitedTemplates;
Примите этот ответ, поскольку он соответствует вашим отредактированным требованиям больше, чем моим
@GragasIncoming Да, я поправил ответ на него
Вы можете прокомментировать код для поддержки php 5? $visitedTemplates = $_SESSION['visitedTemplates'] ?? [];
@GragasIncoming Нет, но не так сложно прочитать необходимые изменения на основе уже сделанных мной комментариев :-) Предоставленной мной информации должно быть достаточно, чтобы вы могли создать решение.
@GragasIncoming Тем не менее, этот ответ - хорошее начало для изучения тернарного оператора if.
что, если я заменю ?? на ?:?
@GragasIncoming В большинстве случаев должно работать, попробуйте ;-)
Тот же шаблон отображается снова, как я делал со случайным. Я заметил, что в браузере не хранятся сеансы
@GragasIncoming Давайте продолжить обсуждение в чате.
@GragasIncoming Исправлена еще одна опечатка, теперь должно работать.
Вы можете использовать оператор
ifв сочетании с переменной$_SESSION[]для сохранения предыдущей страницы и исключения предыдущей страницы из массива перед вызовом вашей процедуры rand