1

我有一个名字列表:

$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 个限制的名称列表进行排序?

4

1 回答 1

1

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

array_splice()仅在参数 2 和 3 中采用整数值,因此如果计数为奇数,则该数字将被截断/取整。此逻辑可确保您永远不会发生任何键值冲突。

代码:(演示

$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',
)
---
于 2020-12-16T06:58:53.400 回答