根据 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 个限制:
名称不能分配给自己,例如"Claudio" => "Claudio"
.
排序不能有不同的结果。换句话说,如果它在第一次运行时生成一个结果,那么它运行的所有其他时间都必须生成相同的结果。
我正在考虑使用某种类型的散列检查,但这不能保证名称会分配给自己。
我尝试使用
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',
)
---
我有一个名单:
$array = array(
"Alberto",
"Bianca",
"Claudio",
"Douglas",
"Erica"
);
我想随机排序这个列表来生成一个 array_map 这样的:
$array = array(
"Alberto" => "Claudio",
"Bianca" => "Erica",
"Claudio" => "Douglas",
"Douglas" => "Bianca",
"Erica" => "Alberto"
);
有 2 个限制:
名称不能分配给自己,例如
"Claudio" => "Claudio"
.排序不能有不同的结果。换句话说,如果它在第一次运行时生成一个结果,那么它运行的所有其他时间都必须生成相同的结果。
我正在考虑使用某种类型的散列检查,但这不能保证名称会分配给自己。
我尝试使用
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',
)
---