Предотвращение дублирования строки array_rand в PHP

Я произвольно выбираю шаблоны 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

Вы можете использовать оператор if в сочетании с переменной $_SESSION[] для сохранения предыдущей страницы и исключения предыдущей страницы из массива перед вызовом вашей процедуры rand

pokeybit 30.04.2018 09:34

или, может быть, перетасовать шаблоны и сохранить их все в сеансе?

Gragas Incoming 30.04.2018 09:38

"все шаблоны в случайном порядке" - точное определение тасовать ;-) Но вы должны решить, что вы хотите, чтобы произошло, когда у вас закончатся шаблоны.

Álvaro González 30.04.2018 09:41

Shuffle все еще может показывать предыдущую страницу, прочтите OP, ребята

pokeybit 30.04.2018 09:42

@pokeybit Да, я редактировал это в своем комментарии.

Álvaro González 30.04.2018 09:42

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

Gragas Incoming 30.04.2018 09:43

Да, но нормально ли, что последний шаблон в каждом запуске становится первым шаблоном при следующем запуске?

Álvaro González 30.04.2018 09:47

Нет, просто перемешай их

Gragas Incoming 30.04.2018 09:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
8
119
2

Ответы 2

Вы можете использовать оператор 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 ниже / выше

pokeybit 30.04.2018 09:44

Я пробовал ваш код, но получаю те же шаблоны, прежде чем их все вижу. Это не работает должным образом.

Gragas Incoming 30.04.2018 13:28

Чтобы это работало, вам нужно сохранить, какие шаблоны уже загружены посетителем. Это можно сохранить в сеансе, например:

//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;

Примите этот ответ, поскольку он соответствует вашим отредактированным требованиям больше, чем моим

pokeybit 30.04.2018 09:47

@GragasIncoming Да, я поправил ответ на него

Philipp Maurer 30.04.2018 09:53

Вы можете прокомментировать код для поддержки php 5? $visitedTemplates = $_SESSION['visitedTemplates'] ?? [];

Gragas Incoming 30.04.2018 09:55

@GragasIncoming Нет, но не так сложно прочитать необходимые изменения на основе уже сделанных мной комментариев :-) Предоставленной мной информации должно быть достаточно, чтобы вы могли создать решение.

Philipp Maurer 30.04.2018 09:57

@GragasIncoming Тем не менее, этот ответ - хорошее начало для изучения тернарного оператора if.

Philipp Maurer 30.04.2018 09:59

что, если я заменю ?? на ?:?

Gragas Incoming 30.04.2018 10:04

@GragasIncoming В большинстве случаев должно работать, попробуйте ;-)

Philipp Maurer 30.04.2018 10:05

Тот же шаблон отображается снова, как я делал со случайным. Я заметил, что в браузере не хранятся сеансы

Gragas Incoming 30.04.2018 10:30

@GragasIncoming Давайте продолжить обсуждение в чате.

Philipp Maurer 30.04.2018 10:41

@GragasIncoming Исправлена ​​еще одна опечатка, теперь должно работать.

Philipp Maurer 30.04.2018 11:12

Другие вопросы по теме