Skip to content

Instantly share code, notes, and snippets.

@Vamoss
Last active April 30, 2018 21:20
Show Gist options
  • Save Vamoss/60d647f2f3ede6e1d449f5e0f265f256 to your computer and use it in GitHub Desktop.
Save Vamoss/60d647f2f3ede6e1d449f5e0f265f256 to your computer and use it in GitHub Desktop.
Sort PHP Array in way that a list is consumed and never repeats a sequence
<?php
$mylist = array("item 1", "item 2", "item 3", "item 4", "item 5");
function clone_array_sorted($list) {
$keys = array_keys($list);
shuffle($keys);
$random = array();
foreach ($keys as $key){
$random[] = $list[$key];
}
return $random;
}
function sort_list($firstItemCannotBe = 0){
global $mylist;
//uma lista precisa ter ao menos 2 itens nela
if(count($mylist)<2){
throw new Exception('Lista contém apenas 1 item, não é possível aleatorizar.');
}
//não deixa o primeiro item da lista aleatorizada ser igual ao item da ultima lista
//assim nunca repete uma sequencia
$_SESSION['randomlist'] = clone_array_sorted($mylist);
while ($_SESSION['randomlist'][0] == $mylist[$firstItemCannotBe]) {
$_SESSION['randomlist'] = clone_array_sorted($mylist);
}
}
//para o caso de erro, chame a url ?reset
if(isset($_GET['reset'])){
session_start();
session_destroy();
unset($_SESSION);
}
//inicializa as variaveis de sessão
session_start();
if(!isset($_SESSION['randomlist'])) {
sort_list();
}
//retira o primeiro item da lista
$currentItem = array_shift($_SESSION['randomlist']);
//verifica se foi o ultimo item da lista
//portanto precisa fazer uma nova
if(count($_SESSION['randomlist'])==0){
//neste caso onde $currentItem é apenas uma string, esse codigo funciona
//verificar se para o caso de uma array de itens mais complexos continua funcionando
$index = array_search($currentItem, $mylist);
sort_list($index);
}
?>
<h1>Seu item atual é: <?php echo $currentItem ?>.</h1>
Sua lista atual está assim:
<pre>
<?php var_dump($_SESSION['randomlist']);?>
</pre>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment