ikonkov
@ikonkov

Как рандомизировать массив с сохранением рандомного порядка?

Задача такая, есть многомерный массив состоящий из 300 массивов. Если быть точнее это заполненный повторитель ACF в Wordpress, но суть не меняет - это массив из 300 других массивов. Так как сайт раскопирован на множество копий менять порядок в нем вручную не представляется возможным. Задача такая - нужно чтобы на каждом из сайтов порядок вывода данных из массива был рандомным, но при этом сохранялся в рамках этого сайта. Т.е. на каждой копии его необходимо перемешать, но не перемешивать каждый раз при исполнении. Все функции рандомизации на PHP позволяют перемешивать его в реальном времени - но тогда при каждом обновлении страницы будет новый результат, а мне необходимо просто перемешать массив один раз для каждого сайта с сохранением этого перемешанного значения.
  • Вопрос задан
  • 80 просмотров
Решения вопроса 3
delphinpro
@delphinpro
frontend developer
ЕСЛИ нет данных в кэше
  перемешать массив 
  положить данные в кэш
КОНЕЦ ЕСЛИ

взять данные из кэша
Ответ написан
Комментировать
@rPman
Перемешивай массив с помощью shuffle, он использует какой то свой сид, который при запуске php сбрасывается, т.е. каждый раз одинаково

либо поищи реализации на основе php-шного mt_rand и сидируй его mt_srand (тебе будет достаточно хранить сид, чтобы уникально перемешивать)
Ответ написан
Комментировать
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
<?php

$array = [
    1,2,3,4,5    
];

$seed = 11111;

srand($seed);

$shuffled_array = $array;
shuffle($shuffled_array);
srand();

var_dump($shuffled_array);


для одного и того же $seed будете получать один и тот же результат после shuffle()
дальше только вопрос для каждого сайта инициализировать уникальный $seed и иметь возможность его поменять или сбросить на другое значение если потребуется получить новый результат перемешивания на сайте
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ikonkov
@ikonkov Автор вопроса
В итоге я решил перемешивать массив один раз, и сохранять потом в базу уже перемешанный массив, так как это ACF сделал вот так
function shuffle_assoc($list) {
   // Взял вот тут https://qna.habr.com/q/1006513
    if (!is_array($list)) {
		return $list;
    } 
    $keys = array_keys($list);
    shuffle($keys);
    $random = [];
    foreach ($keys as $key) {
		$random[$key] = $list[$key];
	} 
 	return $random;
}

function reset_testimonials() {
	$source = get_field('test_repeater',  'options');
	$new_order = shuffle_assoc($source);
	update_field( 'test_repeater',  $new_order,  'options' );
	wp_die();	
}

Ну и вывел в админке кнопку которая по AJAX вызывает reset_testimonials и сохраняет новый порядок значений.

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

Войдите, чтобы написать ответ

Похожие вопросы