как код ниже,
<?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, но это не случайно, как вы думаете, оно основано на семени, поэтому он просто сохранит семя, но не может найти, как его отменить, если оно случайное, будет генерировать несколько возможностей, а не только один результат.
создать резервную переменную / псевдоним, переназначить при необходимости.
Основная идея состоит в том, чтобы воссоздать процесс, но перетасовать не значения массива, а индексы массива. Это дает нам сопоставление между перетасованными и исходными индексами:
// 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;
}
Вы не можете отменить случайное перемешивание. Просто сохраните исходный массив и покажите его, если это необходимо, это будет работать как «отмена» тасования