Php 使用随机组顺序按组对关联数组排序
我有一个指示组的关联数组键/值。我想对数组进行洗牌,这样组就可以按随机顺序排列,但组中的项目只能在组内进行洗牌。换句话说,我想采取如下措施:Php 使用随机组顺序按组对关联数组排序,php,sorting,shuffle,Php,Sorting,Shuffle,我有一个指示组的关联数组键/值。我想对数组进行洗牌,这样组就可以按随机顺序排列,但组中的项目只能在组内进行洗牌。换句话说,我想采取如下措施: [ [ "name" => "Buffy", "group" => 1 ], [ "name" => "Willow", "group" => 1 ], [ "name" => "Xander",
[
[
"name" => "Buffy",
"group" => 1
],
[
"name" => "Willow",
"group" => 1
],
[
"name" => "Xander",
"group" => 2
],
[
"name" => "Giles",
"group" => 2
],
[
"name" => "Tara",
"group" => 3
],
[
"name" => "Angel",
"group" => 3
],
[
"name" => "Spike",
"group" => 3
]
]
[
[
"name" => "Spike",
"group" => 3
]
[
"name" => "Angel",
"group" => 3
],
[
"name" => "Tara",
"group" => 3
],
[
"name" => "Willow",
"group" => 1
],
[
"name" => "Buffy",
"group" => 1
],
[
"name" => "Xander",
"group" => 2
],
[
"name" => "Giles",
"group" => 2
],
]
然后返回更像这样的内容:
[
[
"name" => "Buffy",
"group" => 1
],
[
"name" => "Willow",
"group" => 1
],
[
"name" => "Xander",
"group" => 2
],
[
"name" => "Giles",
"group" => 2
],
[
"name" => "Tara",
"group" => 3
],
[
"name" => "Angel",
"group" => 3
],
[
"name" => "Spike",
"group" => 3
]
]
[
[
"name" => "Spike",
"group" => 3
]
[
"name" => "Angel",
"group" => 3
],
[
"name" => "Tara",
"group" => 3
],
[
"name" => "Willow",
"group" => 1
],
[
"name" => "Buffy",
"group" => 1
],
[
"name" => "Xander",
"group" => 2
],
[
"name" => "Giles",
"group" => 2
],
]
我意识到这可能需要两到三种排序,但如果可以用一个usort
试试看,那就太好了
$groups = [];
foreach (array_unique(array_column($myar, 'group')) as $k) $groups[$k] = rand();
foreach (array_keys($myar) as $k) $myar[$k]['rnd'] = rand();
usort($myar, function($a, $b) use ($groups) {
if ($gdif = $groups[$b['group']] - $groups[$a['group']]) return $gdif;
return $b['rnd'] - $a['rnd'];
});
foreach (array_keys($myar) as $k) unset($myar[$k]['rnd']);
print_r($myar);
使用数据运行,这是一个结果
Array
(
[0] => Array
(
[name] => Buffy
[group] => 1
)
[1] => Array
(
[name] => Willow
[group] => 1
)
[2] => Array
(
[name] => Angel
[group] => 3
)
[3] => Array
(
[name] => Tara
[group] => 3
)
[4] => Array
(
[name] => Spike
[group] => 3
)
[5] => Array
(
[name] => Giles
[group] => 2
)
[6] => Array
(
[name] => Xander
[group] => 2
)
)
基本上,我的解决方案洗牌输入数组,临时重组输入数组以收集具有相同
组值的子数组,然后将数据返回到其原始结构
代码:()
*请注意,…
(splat操作符)允许数组_push()
单独存储所有子数组(每个组内),以生成原始结构
可能的产出:
array (
0 =>
array (
'name' => 'Xander',
'group' => 2,
),
1 =>
array (
'name' => 'Giles',
'group' => 2,
),
2 =>
array (
'name' => 'Willow',
'group' => 1,
),
3 =>
array (
'name' => 'Buffy',
'group' => 1,
),
4 =>
array (
'name' => 'Spike',
'group' => 3,
),
5 =>
array (
'name' => 'Tara',
'group' => 3,
),
6 =>
array (
'name' => 'Angel',
'group' => 3,
),
)
这是一个有趣的问题,但我可以问一下,为什么在示例中有初始结构?如果你想对组进行操作,为什么不使用:[“组”=>1,“名称”=>[“Buffy”,“Willow”]]这段代码也不会随机化组的顺序。@Nick。谢谢错过了。给我几分钟时间,我会解决这个问题和其他一些问题。这些数据是否碰巧来自查询的结果集?