Перемешивание массива php без того же значения до или после

Перемешать массив в php легко, но моя проблема в том, что я пытаюсь перетасовать его, не получая тот же результат раньше, чем после этого ключа.

Пример:

Array ( 0 => 1, 1 => 2, 2 => 3, 3 => 3 ) 

У меня должен быть результат без 3 совместных действий.

Пример некоторого массива, который я хочу:

 Array ( 0 => 2, 1 => 3, 2 => 1, 3 => 3 ) 

Я попытался проверить каждый элемент массива, если это произойдет, я снова перетасовываю его и проверяю другое время. Но это похоже на то, что они теряют время и процесс.

EDIT: Вот код, который я использую:

 do { $not_valid=false; for($i=0;$i<sizeof($arr_times)-1;$i++){ if($arr_times[$i]==$arr_times[$i+1]) $not_valid=true; } if($not_valid) shuffle($arr_times); }while ($not_valid); 

Хотя php действительно имеет много странных функций – у него нет какой-либо описанной ситуации.

Поэтому вы должны сделать это вручную.

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

Из списка Shuffle, гарантируя, что элемент не останется в одном положении

 <?php $foo = array( 0, 1, 2, 3, 4, ); for ($i = 0, $c = sizeof($foo); $i < $c - 1; $i++) { $new_i = rand($i + 1, $c - 1); list($foo[$i], $foo[$new_i]) = array($foo[$new_i], $foo[$i]); } var_export($foo); // Derangement