根据 2 个限制随机排序名称列表以创建第二个列表(地图)

Sorting a list of names randomly to create a second list(map) based on 2 restriction

我有一个名单:

$array = array(
    "Alberto",  
    "Bianca",  
    "Claudio",  
    "Douglas",
    "Erica"
);

我想随机排序这个列表来生成一个 array_map 这样的:

$array = array(
    "Alberto" => "Claudio",  
    "Bianca" => "Erica",  
    "Claudio" => "Douglas",  
    "Douglas"  => "Bianca",
    "Erica" => "Alberto"
);

有 2 个限制:

  1. 名称不能分配给自己,例如"Claudio" => "Claudio".

  2. 排序不能有不同的结果。换句话说,如果它在第一次运行时生成一个结果,那么它运行的所有其他时间都必须生成相同的结果。

我正在考虑使用某种类型的散列检查,但这不能保证名称会分配给自己。

我尝试使用

rsort($array);

但是如果数组中的元素个数是奇数,这将不起作用,在我的示例中,我的行会出现问题

"Claudio" => "Claudio"

有什么方法可以在不违反 2 个限制的情况下对这个名称列表进行排序吗?

“甲板切割”怎么样? IOW,将一半的元素移到后面。这将是一致的,不会“中断”。唯一需要考虑的是,如果元素个数小于2(无法修改),不妨抛出异常。

array_splice() 参数 2 和 3 只取整数值,所以如果计数是奇数,数字将是 truncated/floored。此逻辑可确保您永远不会发生任何键值冲突。

代码:(Demo)

$arrays = [
    ["Alberto"],
    ["Alberto", "Bianca"],
    ["Alberto", "Bianca", "Claudio"],
    ["Alberto", "Bianca", "Claudio", "Douglas"],
    ["Alberto", "Bianca", "Claudio", "Douglas", "Erica"]
];

foreach ($arrays as $array) {
    $original = $array;
    array_push($array, ...array_splice($array, 0, count($array) / 2));
    var_export(array_combine($original,$array));
    echo "\n---\n";
}

输出:

array (
  'Alberto' => 'Alberto',
)
---
array (
  'Alberto' => 'Bianca',
  'Bianca' => 'Alberto',
)
---
array (
  'Alberto' => 'Bianca',
  'Bianca' => 'Claudio',
  'Claudio' => 'Alberto',
)
---
array (
  'Alberto' => 'Claudio',
  'Bianca' => 'Douglas',
  'Claudio' => 'Alberto',
  'Douglas' => 'Bianca',
)
---
array (
  'Alberto' => 'Claudio',
  'Bianca' => 'Douglas',
  'Claudio' => 'Erica',
  'Douglas' => 'Alberto',
  'Erica' => 'Bianca',
)
---