Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用随机组顺序按组对关联数组排序_Php_Sorting_Shuffle - Fatal编程技术网

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。谢谢错过了。给我几分钟时间,我会解决这个问题和其他一些问题。这些数据是否碰巧来自查询的结果集?