php - 从多维数组项构建唯一的字符串列表
问题描述
我有一个多维数组:
$items = array(
array("A1", "A2", "A3"),
array("B1","B2","B3","B4"),
array("C1","C2","C3","C4","C5"),
array("D1","D2","D3"));
我需要构建一个唯一字符串列表,每个字符串都应包含每个数组中的一项,如下所示:
A1 B1 C1 D1 ,
A1 B1 C1 D2 ,
A1 B1 C1 D3 ,
A1 B1 C2 D1 ,
A1 B1 C2 D2等
...
上面的示例数据应该产生 180 个组合(3*4*5*3=180)。
困难在于代码(在最佳情况下)应该适用于任意数量的数组。不仅仅是上面例子中的 4。
例如,我会添加:array("E1", "E2");
并且代码应该仍然可以工作。
更简单的版本可能使用固定的数组集,例如 4(如上例所示)。
当然我可以使用循环,但在这种情况下,每次我添加另一个数据数组时for
都需要添加另一个循环(不是那么通用,对吗?)。for
这是我尝试过的,但没有成功:
$items = array(
array("A1", "A2", "A3"),
array("B1","B2","B3","B4"),
array("C1","C2","C3","C4","C5"),
array("D1","D2","D3"));
$depth = count($items);
$index = $depth - 1;
for ($i = 0; $i <= $index; $i++) {
$depth2 = count($items[$i]);
$index2 = $depth2 - 1;
echo "SET: ";
for ($i2 = 0; $i2 <= $index2; $i2++) {
echo $items[$i2][$i].", ";
}
echo "<br>";
}
预期结果是 180 个唯一字符串的列表,例如:
A1 B1 C1 D1 ,
A1 B1 C1 D2 ,
A1 B1 C1 D3 ,
A1 B1 C2 D1 ,
A1 B1 C2 D2等
...
解决方案
您可以使用递归来构建结果集,类似于使用回溯置换数组的方式。这个想法是从每个数组中一次包含一个项目并将其添加到正在进行的结果中,然后递归该可能性。在探索了给定元素的所有结果可能性之后,我们将其从进一步考虑中丢弃,并转移到下一个元素,重复该过程。
<?php
function combos($items, &$curr=[], &$res=[], $i=0) {
if ($i >= count($items)) {
$res[]= $curr;
}
else {
foreach ($items[$i] as $e) {
$curr[]= $e;
combos($items, $curr, $res, $i + 1);
array_pop($curr);
}
}
return $res;
}
$items = [
["A1", "A2", "A3"],
["B1","B2","B3","B4"],
["C1","C2","C3","C4","C5"],
["D1","D2","D3"]
];
$i = 0;
foreach (combos($items) as $combo) {
echo str_pad($i++ . ": ", 5, " ", false) . implode(" ", $combo) . "\n";
}
输出:
0: A1 B1 C1 D1
1: A1 B1 C1 D2
2: A1 B1 C1 D3
3: A1 B1 C2 D1
4: A1 B1 C2 D2
5: A1 B1 C2 D3
6: A1 B1 C3 D1
7: A1 B1 C3 D2
...
172: A3 B4 C3 D2
173: A3 B4 C3 D3
174: A3 B4 C4 D1
175: A3 B4 C4 D2
176: A3 B4 C4 D3
177: A3 B4 C5 D1
178: A3 B4 C5 D2
179: A3 B4 C5 D3
推荐阅读
- java - TESR 不渲染颜色,纹理偏移
- python - 如何从python中的列表中获取唯一值
- rsocket - 为什么在已连接的套接字上订阅 RSocket connectionStatus() 会导致两个回调调用?
- mysql - 从 STATION 表中选择以元音开头和结尾的城市名称
- javascript - Electron js webContents.print 选项不起作用(总是在 A4 页面上打印)
- laravel - 按不适用于 Laravel Dusk 中的选择器
- arrays - Powershell - 如何检索对象 [] 数据
- c# - RabbitMQ.Client.Exceptions.BrokerUnreachableException:'指定的端点都不可到达'
- javascript - 使用 css 和 javascript 垂直滚动文本
- sql - 在dataGrip中激活外键约束错误