Перемешивание массива и отмена

как код ниже,

<?php
// sort array in a fixed order with given seed
function do_shuffle( $array, $seed ) {
    mt_srand( $seed );
    usort( $array, fn() => mt_rand( - 9, 9 ) );
    return $array;
}

// the reverse operation of do_shuffle
function undo_shuffle( $array, $seed ) {
    return $array; // to implement
}

$origin_array = str_split( 'olive tree' );

$seed = 20220502;

$shuffled_array = do_shuffle( $origin_array, $seed );
var_dump( $shuffled_array );

// undo shuffle
$origin_array = undo_shuffle( $shuffled_array, $seed );
var_dump( $origin_array );

как реализовать перетасовку массива и его обратную операцию?

как вернуть $shuffled_array в $origin_array?

Вы не можете отменить случайное перемешивание. Просто сохраните исходный массив и покажите его, если это необходимо, это будет работать как «отмена» тасования

Lothric 03.05.2022 06:32

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

Faesal 03.05.2022 06:46

создать резервную переменную / псевдоним, переназначить при необходимости.

Shubham Dange 03.05.2022 08:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
3
3
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная идея состоит в том, чтобы воссоздать процесс, но перетасовать не значения массива, а индексы массива. Это дает нам сопоставление между перетасованными и исходными индексами:

// the reverse operation of do_shuffle
function undo_shuffle( $array, $seed ) {
    mt_srand( $seed );

    $indices_map = range(0, count($array) - 1);

    // We do just the same shuffle operation but
    // shuffling array indices instead of values
    usort( $indices_map, function(){ 
      return mt_rand( - 9, 9 );
    } );

    // Restore original array using the map we've created
    $out = [];
    foreach( $indices_map as $shuffled_index => $original_index )
      $out[ $original_index ] = $array[ $shuffled_index ];

    // Sort our output by integer key
    ksort($out);

    return $out;
}

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