【问题标题】:Sorting a list of names randomly to create a second list(map) based on 2 restriction随机排序名称列表以根据 2 个限制创建第二个列表(地图)
【发布时间】:2020-02-06 20:32:37
【问题描述】:

我有一个名字列表:

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

我想对这个列表进行随机排序以生成这样的 array_map:

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

有两个限制:

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

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

我正在考虑使用某种类型的哈希检查,但这并不能保证会为自己分配一个名称。

我尝试使用

rsort($array);

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

"Claudio" => "Claudio"

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

【问题讨论】:

  • 那么你是否真的需要某种“真正的”随机性来获得结果,或者那不是重要的部分?既然你说你试过rsort,我会认为不是吗?然后你可以简单地将所有条目偏移一个——Alberto->Bianca、Bianca->Claudio……这可以使用一个简单的 for 循环来完成,并使用模数“环绕”索引变量。
  • 实际上,我不需要结果的“真实”随机性。我将使用您的想法作为解决方案——Alberto->Bianca,Bianca->Claudio。谢谢。

标签: php arrays sorting shuffle name-collision


【解决方案1】:

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

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

代码:(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',
)
---

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 2021-10-12
    • 1970-01-01
    • 2018-11-04
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2020-10-29
    相关资源
    最近更新 更多