[英]Build a unique string list from multidimensional array items
我有一個多維數組:
$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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.