2013-10-04 98 views
3

我需要爲一組過濾器/參數的所有可能組合創建一個網址列表。計算集合/組的所有可能組合

輸入

$data = array(
    array(
     'vehicle=car', 
     'vehicle=bike', 
     'vehicle=plane', 
    ), 
    array(
     'fruit=apple', 
     'fruit=banana', 
     'fruit=strawberry' 
    ), 
    array(
     'music=pop', 
     'music=rock', 
     'music=jazz' 
    ) 
); 

所生成的項目必須有按字母順序的參數。
例如:

INCORRECT: ?vehicle=bike&fruit=apple&music=rock 

CORRECT: ?fruit=apple&music=rock&vehicle=bike 

輸出

?vehicle=car 
?vehicle=bike 
?vehicle=plane 
?fruit=apple&vehicle=car 
?fruit=banana&vehicle=car 
?fruit=strawberry&vehicle=car 
?fruit=apple&vehicle=bike 
?fruit=banana&vehicle=bike 
?fruit=strawberry&vehicle=bike 
?fruit=apple&vehicle=plane 
?fruit=banana&vehicle=plane 
?fruit=strawberry&vehicle=plane 
?fruit=apple&music=pop&vehicle=car 
?fruit=apple&music=rock&vehicle=car 
?fruit=apple&music=jazz&vehicle=car 
?fruit=banana&music=pop&vehicle=car 
?fruit=banana&music=rock&vehicle=car 
?fruit=banana&music=jazz&vehicle=car 
?fruit=strawberry&music=pop&vehicle=car 
?fruit=strawberry&music=rock&vehicle=car 
?fruit=strawberry&music=jazz&vehicle=car 
?fruit=apple&music=pop&vehicle=bike 
?fruit=apple&music=rock&vehicle=bike 
?fruit=apple&music=jazz&vehicle=bike 
?fruit=banana&music=pop&vehicle=bike 
?fruit=banana&music=rock&vehicle=bike 
?fruit=banana&music=jazz&vehicle=bike 
?fruit=strawberry&music=pop&vehicle=bike 
?fruit=strawberry&music=rock&vehicle=bike 
?fruit=strawberry&music=jazz&vehicle=bike 
?fruit=apple&music=pop&vehicle=plane 
?fruit=apple&music=rock&vehicle=plane 
?fruit=apple&music=jazz&vehicle=plane 
?fruit=banana&music=pop&vehicle=plane 
?fruit=banana&music=rock&vehicle=plane 
?fruit=banana&music=jazz&vehicle=plane 
?fruit=strawberry&music=pop&vehicle=plane 
?fruit=strawberry&music=rock&vehicle=plane 
?fruit=strawberry&music=jazz&vehicle=plane 
?music=pop&vehicle=car 
?music=rock&vehicle=car 
?music=jazz&vehicle=car 
?music=pop&vehicle=bike 
?music=rock&vehicle=bike 
?music=jazz&vehicle=bike 
?music=pop&vehicle=plane 
?music=rock&vehicle=plane 
?music=jazz&vehicle=plane 
?fruit=apple 
?fruit=banana 
?fruit=strawberry 
?fruit=apple&music=pop 
?fruit=apple&music=rock 
?fruit=apple&music=jazz 
?fruit=banana&music=pop 
?fruit=banana&music=rock 
?fruit=banana&music=jazz 
?fruit=strawberry&music=pop 
?fruit=strawberry&music=rock 
?fruit=strawberry&music=jazz 
?music=pop 
?music=rock 
?music=jazz 

是否有任何人可以幫助我與此有關。現在我已經掙扎了兩天了,但我似乎無法找到一個正確的解決方案。在Stackoverflow上有很多(幾乎)類似的問題,但他們都沒有解決/適合我的問題。

[解決] 這是基於杜尚Plavak的回答最終的工作版本:

function createFilterCombinations($data, &$urls = array(), $index = 0, $query = false){ 
    $keys = array_keys($data); 
    $_query = $query; 
    if ($index == count($data)) { 
     return; 
    } 
    for($i=0; $i < count($data[$keys[$index]]); $i++){ 
     $query = $_query; 
     if($index == 0){ 
      $query = "?" . $data[$keys[$index]][$i]; 
     }else{ 
      if($query != "?"){ 
       $query .= "&" . $data[$keys[$index]][$i]; 
      }else{ 
       $query .= $data[$keys[$index]][$i]; 
      } 
     } 
     $urls[] = $query; 
     createFilterCombinations($data, $urls, $index+1, $query); 
    } 
    if($index == 0){ 
     $query = "?"; 
    } else { 
     $query = $_query; 
    } 
    createFilterCombinations($data, $urls, $index+1, $query); 
} 

function prepareArray($array){ 
    $newArray = array(); 
    foreach ($array as $subArray) { 
     sort($subArray); 
     $newArray[substr($subArray[0], 0, strpos($subArray[0], '='))] = $subArray; 
    } 
    ksort($newArray); 
    return $newArray; 
} 

createFilterCombinations(prepareArray($data), $result); 

var_dump($result); 
+4

+1粘貼正確的PHP數組,我們可以複製/粘貼,而不是的var_dump輸出() – Cups

回答

2

所以看這個http://codepad.org/TZWf7Vxd

和代碼的時候鏈接會死人:d

<?php 
$data = array(
    "vehicle" => array(
     'vehicle=car', 
     'vehicle=bike', 
     'vehicle=plane', 
    ), 
    "fruit" => array(
     'fruit=apple', 
     'fruit=banana', 
     'fruit=strawberry' 
    ), 
    "music" => array(
     'music=pop', 
     'music=rock', 
     'music=jazz' 
    ) 
); 
function hop($index, $query, $data){ 
    $keys = array_keys($data); 
    if($index == count($data)){ 
     return; 
    } 
    $queryBackup = $query; 
    for($i=0;$i<count($data[$keys[$index]]);$i++){ 
     $query = $queryBackup; 
     if($index == 0){ 
      $query = "?".$data[$keys[$index]][$i]; 
     }else{ 
      if($query != "?"){ 
       $query .= "&".$data[$keys[$index]][$i]; 
      }else{ 
       $query .= $data[$keys[$index]][$i]; 
      } 
     } 
     echo $query."\n"; 
     hop($index+1, $query, $data); 
    } 
    if($index == 0){ 
    $query = "?"; 
    }else{ 
    $query = $queryBackup; 
    } 
    hop($index+1, $query, $data); 
} 

ksort($data); 
hop(0,"", $data); 
?> 
+0

對不起,我忘了,你還想要這是不完整的cominations .. –

+0

這是一個開始,但它只顯示了63個可能性中的39個。 [列表示例](http://pastebin.com/XM2Nksyw) – Chris

+0

看起來不錯,最理想的情況是如果「跳躍」函數返回一個數組而不是僅僅回顯它們。那可能嗎? '$ result = hop(0,「」,$ data);' – Chris

0

這不是現成的解決方案,但您可以使用返回ns數組組合。我希望這可以幫助你。

<? 
$collect = false; 
function combinations($arr, $temp_string, &$collect) { 
     if ($temp_string != "") 
      $collect[] = $temp_string; 
     for ($i = 0; $i < sizeof($arr); $i++) { 
      $arrcopy = $arr; 
      $elem = array_splice($arrcopy, $i, 1); 
      if (sizeof($arrcopy) > 0) { 
       combinations($arrcopy, $temp_string . " " . $elem[0], $collect); 
      } else { 
       $collect[] = $temp_string . " " . $elem[0]; 
      } 
     } 
     return $collect; 
    } 
var_dump(combinations(array('abc', 'cde', 'fgi'),'',$collect)); 
?> 

看到WORKING CODE

+0

我其實已經嘗試過使用這個昨天。找到它[這裏](http://stackoverflow.com/questions/10834393/php-how-to-get-all-possible-combinations-of-1d-array)。這實際上解決了部分問題。 – Chris