php 数组随机排序_PHP随机随机排列数组,包含键=>值

这篇博客讨论了如何在PHP中随机排列一个包含键值对的数组,同时保持键与值的对应关系。提供的解决方案包括使用`shuffle`函数结合数组操作,以及使用自定义函数实现随机排序。示例代码展示了如何对包含ID和距离的数组进行随机化,以达到每次显示结果都不一样的效果。
摘要由CSDN通过智能技术生成

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) {

/* Auxiliary array to hold the new order */

$aux = array();

/* We work with an array of the keys */

$keys = array_keys($array);

/* We shuffle the keys */`enter code here`

shuffle($keys);

/* We iterate thru' the new order of the keys */

foreach($keys as $key) {

/* We insert the key, value pair in its new order */

$aux[$key] = $array[$key];

/* We remove the element from the old array to save memory */

unset($array[$key]);

}

/* The auxiliary array with the new order overwrites the old variable */

$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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值