PHP随機随機排列數組,包含鍵=>值
我一直在谷歌上尋找答案,但似乎找不到一個萬無一失的東西,而且真的負擔不起将其弄亂(進入生産站點)。
我所擁有的是具有20多個過濾器的進階搜尋,它傳回一個包含ID和Distance的數組。 我需要做的是将這些結果混洗以每次随機顯示。 目前我得到的數組是:
Array (
[0] => Array ( [id] => 1 [distance] => 1.95124994507577 )
[1] => Array ( [id] => 13 [distance] => 4.75358968511882 )
[2] => Array ( [id] => 7 [distance] => 33.2223233233323 )
[3] => Array ( [id] => 21 [distance] => 18.2155453552336 )
[4] => Array ( [id] => 102 [distance] = 221.2212587899658 )
)
我需要做的是每次都對它們進行随機化或排序,但要保持ID和距離對,即:
Array (
[4] => Array ( [id] => 102 [distance] = 221.2212587899658 )
[1] => Array ( [id] => 13 [distance] => 4.75358968511882 )
[3] => Array ( [id] => 21 [distance] => 18.2155453552336 )
[2] => Array ( [id] => 7 [distance] => 33.2223233233323 )
[0] => Array ( [id] => 1 [distance] => 1.95124994507577 )
)
謝謝 :)
lethalMango asked 2020-07-24T12:14:44Z
9個解決方案
85 votes
shuffle文檔下的第一條使用者文章:
随機關聯 保留時的非關聯數組 鍵,值對。 同時傳回 改組而不是改組 到位。
function shuffle_assoc($list) {
if (!is_array($list)) return $list;
$keys = array_keys($list);
shuffle($keys);
$random = array();
foreach ($keys as $key) {
$random[$key] = $list[$key];
}
return $random;
}
測試用例:
$arr = array();
$arr[] = array('id' => 5, 'foo' => 'hello');
$arr[] = array('id' => 7, 'foo' => 'byebye');
$arr[] = array('id' => 9, 'foo' => 'foo');
print_r(shuffle_assoc($arr));
print_r(shuffle_assoc($arr));
print_r(shuffle_assoc($arr));
karim79 answered 2020-07-24T12:15:09Z
17 votes
從5.3.0版開始,您可以執行以下操作:
uksort($array, function() { return rand() > rand(); });
Hamish answered 2020-07-24T12:15:29Z
4 votes
在這裡看看這個功能:
$foo = array('A','B','C');
function shuffle_with_keys(&$array) {
$aux = array();
$keys = array_keys($array);
`enter code here`
shuffle($keys);
foreach($keys as $key) {
$aux[$key] = $array[$key];
unset($array[$key]);
}
$array = $aux;
}
shuffle_with_keys($foo);
var_dump($foo);
原始文章在這裡:[http://us3.php.net/manual/zh/function.shuffle.php#83007]
v1r00z answered 2020-07-24T12:15:56Z
3 votes
我很難提供大多數答案-是以我建立了這個小片段,将我的數組放入并在保持其鍵的同時将它們随機化:
function assoc_array_shuffle($array)
{
$orig = array_flip($array);
shuffle($array);
foreach($array AS $key=>$n)
{
$data[$n] = $orig[$n];
}
return array_flip($data);
}
chaudruc answered 2020-07-24T12:16:16Z
3 votes
function shuffle_assoc($array)
{
$keys = array_keys($array);
shuffle($keys);
return array_merge(array_flip($keys), $array);
}
Jake Wilson answered 2020-07-24T12:16:32Z
2 votes
嘗試從此處使用fisher-yates算法:
function shuffle_me($shuffle_me) {
$randomized_keys = array_rand($shuffle_me, count($shuffle_me));
foreach($randomized_keys as $current_key) {
$shuffled_me[$current_key] = $shuffle_me[$current_key];
}
return $shuffled_me;
}
我必須為我的大學畢業論文實施與此類似的方法,并且效果很好。
JesseBuesking answered 2020-07-24T12:16:56Z
2 votes
Charles Iliya Krempeaux在這個問題上有不錯的文章,并且這個功能對我來說真的很好:
function shuffle_assoc($array)
{
// Initialize
$shuffled_array = array();
// Get array's keys and shuffle them.
$shuffled_keys = array_keys($array);
shuffle($shuffled_keys);
// Create same array, but in shuffled order.
foreach ( $shuffled_keys AS $shuffled_key ) {
$shuffled_array[ $shuffled_key ] = $array[ $shuffled_key ];
} // foreach
// Return
return $shuffled_array;
}
cwd answered 2020-07-24T12:17:16Z
0 votes
我嘗試了投票最多的解決方案,但該清單不受歡迎。 這是我所做的更改,以使其正常運作。我希望我的陣列鍵從1開始。
$list = array_combine(range(1,10),range(100,110));
$shuffle_list = shuffle_assoc($list);
function shuffle_assoc($list)
{
if (!is_array($list)) return $list;
$keys = array_keys($list);
shuffle($list);
$random = array();
foreach ($keys as $k => $key) {
$random[$key] = $list[$k];
}
return $random;
}
Tom Kim answered 2020-07-24T12:17:37Z
0 votes
使用随機播放的答案總是傳回相同的順序。 這是使用random_int()的一種,每次使用的順序都不同:
function shuffle_assoc($array)
{
while (count($array)) {
$keys = array_keys($array);
$index = $keys[random_int(0, count($keys)-1)];
$array_rand[$index] = $array[$index];
unset($array[$index]);
}
return $array_rand;
}
Gautier answered 2020-07-24T12:17:57Z