2011-09-18 33 views
3

什麼是php函數在保持鍵/值對的同時隨機化關聯數組。我並不是指隨機挑選一個鍵值對,而是實際改變數組(類似於uasort函數,但不是按順序)。php,如何在保持鍵/值對的同時混合/隨機化關聯數組的順序

TIA

例如:

original array 
(
    [a] => 4 
    [b] => 8 
    [c] => -1 
    [d] => -9 
    [e] => 2 
    [f] => 5 
    [g] => 3 
    [h] => -4 
) 

random ordered array 
(

[d] => -9 
[a] => 4 
[b] => 8 
[c] => -1 
[h] => -4 
[e] => 2 
[g] => 3 
[h] => -4 
[f] => 5 
) 

編輯 2個解決方案之間的比較。

$start = microtime(true); 
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4); 
$shuffleKeys = array_keys($array); 
shuffle($shuffleKeys); 
$newArray = array(); 
foreach($shuffleKeys as $key) { 
    $newArray[$key] = $array[$key]; 
} 
print_r ($newArray); 
$elapsed = microtime(true) - $start; 
echo "<br>array values took $elapsed seconds.<br>"; 

$start = microtime(true); 
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4); 
$keys = array_keys($array); 
    shuffle($keys); 
    print_r(array_merge(array_flip($keys) , $array)); 


$elapsed = microtime(true) - $start; 
echo "<br>array values took $elapsed seconds.<br>"; 

陣列(並[h] => -4 [E] => 2 [B] => 8 [d] => -9 [α] => 4 [C] => -1並[f ] => 5 [g] => 3) 數組值取3.0994415283203E-5秒。數組([e] => 2 [a] => 4 [d] => -9 [c] => -1 [g] => 3 [f] => 5 [b] => 8 [h] => -4) 數組值爲4.2915344238281E-5秒。

+0

我首先想到的是與範圍內產生一個隨機數-1回調使用uasort() - 1。但是,我不知道,如果你使用的不確定性與回調會發生什麼uasort。它可能有不愉快的副作用。 – GordonM

+0

謝謝戈登,這是一個很好的想法來測試。 – Jamex

回答

7

你可以使用在array_keys洗牌(),然後在你的陣列循環在新命令將它們添加到列表中。

例如

$shuffleKeys = array_keys($array); 
shuffle($shuffleKeys); 
$newArray = array(); 
foreach($shuffleKeys as $key) { 
    $newArray[$key] = $array[$key]; 
} 
+0

編輯爲真正有效-_- –

+0

感謝Jon,偉大的代碼,它會很有趣,看看這段代碼是否比str更快。 – Jamex

+0

「$ shuffleKey」中還有一個's'(或缺少's')。否則,該功能起作用。你的代碼比str引用的代碼更快。查看原始帖子中的結果。 – Jamex

4

shuffle()註釋可能做的伎倆:http://ch2.php.net/manual/en/function.shuffle.php#104430

<?php 
function shuffle_assoc($array) 
{ 
    $keys = array_keys($array); 
    shuffle($keys); 
    return array_merge(array_flip($keys) , $array); 
} 
?> 
+0

感謝str,這是一個很棒的代碼。我想知道哪個更快,這個還是Jon的。 – Jamex

+1

這會導致問題,如果任何鍵是整數。一個完全由數字計數組成的字符串。 – Brilliand

相關問題