天天看點

php 數組随機排序_PHP随機随機排列數組,包含鍵=>值

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