2011-02-06 16 views
8

ho questo per esempio:Shuffle 2 array PHP nello stesso modo

$array['one'][0] = 0; 
$array['one'][1] = 1; 
$array['one'][2] = 2; 
$array['one'][3] = 3; 

$array['two'][0] = 00; 
$array['two'][1] = 11; 
$array['two'][2] = 22; 
$array['two'][3] = 33; 

Come posso mescolare a entrambi di ottenere qualcosa di simile:

$array['one'][0] = 2; 
$array['one'][1] = 1; 
$array['one'][2] = 3; 
$array['one'][3] = 0; 

$array['two'][0] = 22; 
$array['two'][1] = 11; 
$array['two'][2] = 33; 
$array['two'][3] = 00; 

O qualsiasi altro ordine casuale, ma avere lo stesso "fattore casuale" in entrambi?

Ad esempio, voglio che $array['one'][0] e $array['two'][0] rimescolata per ottenere $array['one'][x] e $array['two'][x] (x essendo una chiave casuale, ma lo stesso su entrambi gli array).

+0

I valori del secondo array * sempre * saranno di due cifre? –

+0

No, sono in realtà stringhe, l'ho pubblicato come esempio. – phollz

+0

potresti voler includere il risultato * esatto * che stai cercando, per ottenere la risposta migliore. –

risposta

3

Qualcosa di simile potrebbe funzionare. È simile alla risposta di Mimikry, eccetto che funzionerà anche se si hanno valori duplicati nell'array uno (questo non usa i valori dell'array uno come chiavi dell'array temporaneo).

Supponendo che entrambi gli array abbiano la stessa dimensione.

$c = count($array['one']); 
$tmp = array(); 
for ($i=0; $i<$c; $i++) { 
    $tmp[$i] = array($array['one'][$i], $array['two'][$i]); 
} 
shuffle($tmp); 
for ($i=0; $i<$c; $i++) { 
    $array['one'][$i] = $tmp[$i][0]; 
    $array['two'][$i] = $tmp[$i][1]; 
} 
-1

Non sai esattamente cosa stai cercando di fare, ma la soluzione migliore è probabilmente mettere array 1 e array 2 in un array multidimensionale e quindi random l'array primario. Ciò ti fornirà una disposizione casuale di valori, ma all'interno di ciascuna chiave saranno i valori di ciascun array. Potremmo darti risposte più specifiche se puoi fornire un dettaglio un po 'più dettagliato di quello che stai facendo.

0

spero di averti capito bene.

Per l'esempio sopra riportato, questo codice dovrebbe funzionare. Ma è piuttosto hacky ...

$array['one'][0] = 'A'; 
$array['one'][1] = 'B'; 
$array['one'][2] = 'C'; 
$array['one'][3] = 'D'; 

$array['two'][0] = 'AA'; 
$array['two'][1] = 'BB'; 
$array['two'][2] = 'CC'; 
$array['two'][3] = 'DD'; 

// save the dependencies in tmp array 
foreach ($array['two'] as $key => $val) { 
    $tmp[$array['one'][$key]] = $val; 
} 

shuffle($array['one']); 

// restore dependencies in tmp2 array 
foreach ($array['one'] as $key => $val) { 
    $tmp2[$key] = $tmp[$val]; 
} 

// overwrite with restore array 
$array['two'] = $tmp2; 

var_dump ($ array):

array(2) { 
    ["one"]=> 
    array(4) { 
    [0]=> 
    string(1) "B" 
    [1]=> 
    string(1) "A" 
    [2]=> 
    string(1) "C" 
    [3]=> 
    string(1) "D" 
    } 
    ["two"]=> 
    array(4) { 
    [0]=> 
    string(2) "BB" 
    [1]=> 
    string(2) "AA" 
    [2]=> 
    string(2) "CC" 
    [3]=> 
    string(2) "DD" 
    } 
} 
0

La pratica migliore, imho, è la seguente:

$tmp = array_combine($array['one'],$array['two']); 
shuffle($tmp); 
$array['one'] = array_keys($tmp); 
$array['two'] = array_values($tmp); 

Questo è un codice chiaro e dovrebbe essere veloce. Non c'è bisogno di reinventare la ruota come in altre risposte.

+0

Questo non funziona con valori duplicati o valori non stringa/interi in '$ array ['one']'. – hakre

17
$count = count($array['one']); 
$order = range(1, $count); 

shuffle($order); 
array_multisort($order, $array['one'], $array['two']); 
  • Lavori con array con elementi di qualsiasi tipo (oggetti e array troppo).
  • Questo modo può essere utilizzato con qualsiasi numero di array (non solo due).
  • Funziona con valori duplicati.
  • Codice pulito.
+2

Questa dovrebbe essere la risposta accettata nei miei occhi, +1! – hakre

+0

Questo non funziona. I parametri sono nell'ordine sbagliato: array_multisort (array1, ordinamento, tipo di ordinamento, array2, array3 ...). Anche il valore del parametro order sorting non può essere un array. http://www.php.net/manual/en/function.array-multisort.php –

+0

Una risposta molto vecchia che ancora dà calci +1 –

0

Questo non è un esempio con matrici multidimensionali ma funziona perfettamente per l'ordinamento di più matrici normali allo stesso modo e con shuffle. Forse potrebbe essere adattato anche per gli array multidimensionali. Presume che tutti gli array abbiano la stessa lunghezza.

$array_count = count($array_1); 

for($i=0;$i<=($array_count-1);$i++){ 
    $temp_array[$i] = $i; 
} 

shuffle($temp_array); 

for($i=0;$i<=($array_count-1);$i++){ 
    $o = $temp_array[$i]; 
    $array_1_sorted[$i]=$array_1[$o]; 
    $array_2_sorted[$i]=$array_2[$o]; 
    $array_3_sorted[$i]=$array_3[$o]; 
} 

Questo vi darà nuovi array che sono tutti ordinati in modo casuale. È quindi possibile impostare i vecchi array uguali a quelli nuovi o tenerli intatti.

Problemi correlati