2009-11-21 7 views

Répondre

1

Vous pouvez utiliser array_slice pour copier la partie de la matrice que vous souhaitez mélanger, mélanger la copie, puis utiliser array_splice pour copier les données réorganisées dans la matrice d'origine. Plus généralement, si vous connaissez les clés des éléments que vous voulez mélanger, placez-les dans un tableau appelé $keys. Puis:

// Get out the items to shuffle. 
$work = array(); 
foreach ($keys as $i => $key) { 
    $work[$i] = $myarray[$key]; 
} 

shuffle($work); // shuffle them 

// And put them back. 
foreach ($keys as $i => $key) { 
    $myarray[$key] = $work[$i]; 
} 

(Désolé si cela a des erreurs, mon PHP est rouillé et je ne suis pas près d'un ordinateur où je peux le tester!)

Quelque chose de très similaire fonctionnera pour une multidimensionnelle tableau. Chaque élément de $keys pourrait être un tableau d'indices, et au lieu de $myarray[$key] vous écrirait $myarray[$key[0]][$key[1]].

+0

si le tableau est un tableau multidimensionnel et je veux mélanger certains éléments dans le deuxième niveau, pas le premier niveau? – Steven

+0

OK, il édité pour décrire comment vous appliquer cette technique à un tableau multidimensionnel. –

2

Considérez ce qui suit

function swap(&$a, &$b) { list($a, $b) = array($b, $a); } 

$len = count($a); 
for($i = 0; $i < $len; $i++) { 
    $j = rand(1, $len) - 1; 
    swap($a[$i], $a[$j]); 
} 

cette boucle est la norme qui mélange tous les éléments du tableau. Pour mélanger seulement certains (« mobiles ») éléments, nous allons mettre les clés dans un tableau

$keys = array(1, 3, 5, 7, 9, 11, 13, 17); 

et remplacer la boucle sur $ a avec la boucle sur les touches $

$len = count($keys); 
for($i = 0; $i < $len; $i++) { 
    $j = rand(1, $len) - 1; 
    swap($a[$keys[$i]], $a[$keys[$j]]); 
} 

ce déplace des éléments dans des positions 1, 3, 5, etc., et laisse d'autres éléments en place

+0

Je veux mélanger tableau associatif, tableau non numérique. – Steven

+0

Par http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm, vous voudrez peut-être échanger de rand ($ i, $ len) plutôt que rand (1, $ len). –

Questions connexes