2013-10-04 3 views
3

필터/매개 변수 세트에서 가능한 모든 조합에 대한 URL 목록을 작성해야합니다.집합/그룹에서 가능한 모든 조합을 계산하십시오.

입력

$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 

이 좀 도와 수있는 사람이 있습니까. 나는 2 일 동안 그것으로 지금 고투하고있다 그러나 나는 정확한 해결책을 찾아내는 것을 보일 수 없다. Stackoverflow에는 (거의) 비슷한 문제가 많이 있지만 그 중 아무 것도 내 문제를 해결/맞추는 것 같지 않습니다.

[SOLVED] 여기 는 두산 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 WORKING CODE()를 참조 – 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 중 63을 표시 할 수 있습니다. [예제 목록] (http://pastebin.com/XM2Nksyw) – Chris

+0

'hop'함수가 단지 그들을 반향하는 대신 배열을 반환한다면 가장 이상적인 상황이 될 것입니다. 그게 가능하니? '$ 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)); 
?> 

우리가/붙여 넣기보다는 위해서 var_dump의 출력을 복사 할 수 있습니다 적절한 PHP 배열을 붙여 넣기위한

+0

나는 실제로이 어제를 사용하려고했습니다. 그것을 발견 [여기] (http://stackoverflow.com/questions/10834393/php-how-to-get-all-possible-combinations-of-1d-array). 이것은 실제로 문제의 일부를 해결합니다. – Chris

관련 문제