roark Posted January 20, 2010 Share Posted January 20, 2010 Hi Guys, Could anyone help me with this problem? I would like to shuffle 2 arrays the same i.e: Before shuffling: array 1: 1, 2, 3, 4, 5 array 2: a, b, c, d, e After shuffling: array 1: 2, 4, 5, 3, 1 array 2: b, d, e, c, a Both arrays index order changed in the same manner. I'm really stumped... Thanks Quote Link to comment https://forums.phpfreaks.com/topic/189142-how-do-i-shuffle-2-arrays-exactly-the-same/ Share on other sites More sharing options...
Adam Posted January 20, 2010 Share Posted January 20, 2010 shuffle() is random so there's no way you can repeat it. However you could implement you're own shuffle method, for example: <?php function shuffle2arrays($array1, $array2) { if (count($array1) != count($array2)) { return false; } $count = count($array1); $keys = array_rand(range(0, ($count-1)), $count); $new_array1 = array(); $new_array2 = array(); for ($i = 0; $i < $count; $i++) { $new_array1[$i] = $array1[$keys[$i]]; $new_array2[$i] = $array2[$keys[$i]]; } return array($new_array1, $new_array2); } $array1 = array(1,2,3,4,5); $array2 = array('a','b','c','d','e'); list($array1, $array2) = shuffle2arrays($array1, $array2); print_r($array1); print_r($array2); ?> That's the only way I can think of doing it, someone else may have a much simpler solution though. Quote Link to comment https://forums.phpfreaks.com/topic/189142-how-do-i-shuffle-2-arrays-exactly-the-same/#findComment-998573 Share on other sites More sharing options...
Adam Posted January 20, 2010 Share Posted January 20, 2010 To make it more like shuffle() in-fact you could pass the array by reference: function shuffle2arrays(&$array1, &$array2) { if (count($array1) != count($array2)) { return false; } $count = count($array1); $keys = array_rand(range(0, ($count-1)), $count); $new_array1 = array(); $new_array2 = array(); for ($i = 0; $i < $count; $i++) { $new_array1[$i] = $array1[$keys[$i]]; $new_array2[$i] = $array2[$keys[$i]]; } $array1 = $new_array1; $array2 = $new_array2; return true; } Then you just need to call it with: shuffle2arrays($some_array, $another_array); Quote Link to comment https://forums.phpfreaks.com/topic/189142-how-do-i-shuffle-2-arrays-exactly-the-same/#findComment-998574 Share on other sites More sharing options...
ktsugihara Posted January 20, 2010 Share Posted January 20, 2010 Alternatively, is there an issue with having a multidimensional array? $foo[a][1]; ? I dont know your exact implementation so I dont know if this would work... Quote Link to comment https://forums.phpfreaks.com/topic/189142-how-do-i-shuffle-2-arrays-exactly-the-same/#findComment-998578 Share on other sites More sharing options...
Daniel0 Posted January 20, 2010 Share Posted January 20, 2010 You can do like this: <?php $arr1 = array(1,2,3,4,5,6); $arr2 = array('a','b','c','d','e','f'); $shuffle = array(); for ($i = 0, $size = min(sizeof($arr1), sizeof($arr2)); $i < $size; ++$i) { $shuffle[] = array($arr1[$i], $arr2[$i]); } shuffle($shuffle); foreach ($shuffle as $i => $v) { list($arr1[$i], $arr2[$i]) = $v; } var_dump($arr1, $arr2); Of course you need them to have equal length. Quote Link to comment https://forums.phpfreaks.com/topic/189142-how-do-i-shuffle-2-arrays-exactly-the-same/#findComment-998581 Share on other sites More sharing options...
Adam Posted January 20, 2010 Share Posted January 20, 2010 Alternatively, is there an issue with having a multidimensional array? $foo[a][1]; ? I dont know your exact implementation so I dont know if this would work... It's not recursive if that's what you meant, but it'll work on any 2 single-dimension arrays with equal length. Actually I didn't consider this originally, but it'll only work properly on integer indexes - converting literal indexes to integer in the event of them. I'd just go with Daniel's solution.. Quote Link to comment https://forums.phpfreaks.com/topic/189142-how-do-i-shuffle-2-arrays-exactly-the-same/#findComment-998584 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.