2011-02-06 12 views
8

que tengo esto, por ejemplo:shuffle 2 matrices de PHP en el mismo 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; 

Cómo puedo mezclar los dos para obtener algo como:

$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 cualquier otro orden aleatorio, pero teniendo el mismo "factor aleatorio" en ambos?

Por ejemplo, quiero que $array['one'][0] y $array['two'][0] conseguir barajan para obtener $array['one'][x] y $array['two'][x] (x ser una clave aleatoria, pero el mismo en ambas matrices).

+0

¿Los valores de la segunda matriz * siempre * serán de dos dígitos? –

+0

No, en realidad son cadenas, lo publiqué como un ejemplo. – phollz

+0

es posible que desee incluir el resultado * exacto * que busca, para obtener la mejor respuesta. –

Respuesta

3

Algo como esto podría funcionar. Es similar a la respuesta de Mimikry, excepto que esta funcionará incluso si tiene valores duplicados en la matriz uno (este no usa los valores de la matriz uno como claves de la matriz temporal).

Suponiendo que ambas matrices son del mismo tamaño.

$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

No estoy seguro exactamente de lo que está tratando de hacer, pero su mejor opción es poner la matriz 1 y la matriz 2 en una matriz multidimensional y luego aleatorizar la matriz primaria. Eso le dará una disposición aleatoria de valores, pero dentro de cada clave estarán los valores de cada matriz. Podríamos darle respuestas más específicas si puede proporcionar un poco más de detalle de lo que está haciendo exactamente.

0

espero que te entiendo bien.

Para su ejemplo anterior, este código debería funcionar. Pero es bastante 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 mejor práctica, en mi humilde opinión, es el siguiente:

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

Esto es código claro y debe ser rápido. No es necesario reinventar la rueda como en otras respuestas.

+0

Esto no funciona con valores duplicados o valores sin cadena/enteros en '$ array ['one']'. – hakre

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

shuffle($order); 
array_multisort($order, $array['one'], $array['two']); 
  • Works con matrices con elementos de cualquier tipo (objetos y matrices también).
  • De esta manera se puede utilizar con cualquier cantidad de matrices (no solo dos).
  • Funciona con valores duplicados.
  • Código de limpieza.
+2

¡Esta debería haber sido la respuesta aceptada en mis ojos, +1! – hakre

+0

Esto no funciona. Los parámetros están en el orden incorrecto - array_multisort (array1, orden de clasificación, tipo de ordenación, array2, array3 ...). Además, el valor del parámetro de orden de clasificación no puede ser una matriz. http://www.php.net/manual/en/function.array-multisort.php –

+0

Una respuesta muy antigua que sigue pateando +1 –

0

Esto no es un ejemplo con matrices multidimensionales, pero funciona muy bien para ordenar varias matrices normales de la misma manera y con la reproducción aleatoria. Tal vez podría ser adaptado para matrices multidimensionales también. Asume que todas las matrices tienen la misma longitud.

$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]; 
} 

Esto le dará nuevos arreglos que están ordenados de la misma manera aleatoria. Podrías configurar las matrices antiguas igual a las nuevas o mantenerlas intactas.