2017-01-27 4 views
2

Ich versuche, alle möglichen Kombinationen für eine unbekannte Anzahl von Arrays als solche zu erhalten:Erhalten Sie alle einzigartigen Array Kombinationen mit rechtwinkligen Produkt PHP

Hier ist die JSON-Datenstruktur

[ 
    { 
     "department": "CIS", 
     "name": "Intro to CIS", 
     "sections": [ 
      { 
       "sectionNumber": "01", 
       "regNum": "", 
       "days": "MWF", 
       "startTime": "900", 
       "endTime": "1030", 
       "labDay": "M", 
       "labStartTime": "1300", 
       "labEndTime": "1500" 
      }, 
      { 
       "sectionNumber": "02", 
       "regNum": "098304", 
       "days": "TR", 
       "startTime": "1300", 
       "endTime": "1500", 
       "labDay": "", 
       "labStartTime": "", 
       "labEndTime": "" 
      } 
     ] 
    }, 
    { 
     "department": "MATH", 
     "name": "Intro to MATH", 
     "sections": [ 
      { 
       "sectionNumber": "01", 
       "regNum": "", 
       "days": "MWF", 
       "startTime": "900", 
       "endTime": "1030", 
       "labDay": "M", 
       "labStartTime": "1300", 
       "labEndTime": "1500" 
      }, 
      { 
       "sectionNumber": "02", 
       "regNum": "098304", 
       "days": "TR", 
       "startTime": "1300", 
       "endTime": "1500", 
       "labDay": "", 
       "labStartTime": "", 
       "labEndTime": "" 
      } 
     ] 
    } 
] 

I möchte, dass das Ergebnis wie folgt lautet: Das Ergebnis sollte das assoziative Array des gesamten Kurses enthalten, damit ich auf alle seine Daten zugreifen kann (Abschnittsnummer, RegNr, Tage, .. usw.)

Hinweis, ich weiß nicht, wie viele Kurse oder Abschnitte es gibt. Außerdem sollte ein Kurs niemals mit sich selbst verglichen werden.

Gewünschtes Ergebnis:

[ 
    [ [CIS 01 Array],[MATH 01 Array] ], 
    [ [CIS 01 Array],[MATH 02 Array] ], 
    [ [CIS 02 Array],[MATH 01 Array] ], 
    [ [CIS 02 Array],[MATH 02 Array]] 
] 

Jedes Ergebnis Array sollte Arrays enthalten von Arrays (das die gleiche Länge wie die Anzahl der Gänge sind).


Ich denke, ich soll das Kartesisches Produkt verwenden, aber ich bin nicht ganz sicher, wie dies zu implementieren. Ich begann, so etwas zu tun, aber ich weiß es nicht korrekt ist:

for($i = 0; $i < count($json_data); $i++){ //courses 
    for($k = 0; $k < count($json_data[$i]["sections"]); $k++){ //first sections 
     for($p = 1; $p < count($json_data[$i]["sections"]); $p++){ //all other courses but 1 
      for($h = 0; $h < count($json_data[$i]["sections"][$p]); $h++){ 
       echo $json_data[$i]["sections"][$k]["labDay"]; 
      } 
     } 
    } 
} 
+0

Abhängig von Ihren Speicherbedingungen können Sie eine rekursive Funktion verwenden, die alle verbleibenden Elemente einschließlich sich selbst zu Ihrem Ergebnis-Array hinzufügt. –

+0

@ChrisThorsvik Aber sollte das Ergebnis-Array sein, das Arrays enthält, die Arrays enthalten. Auch sollte ein Kurs niemals mit sich selbst vergleichen. –

+0

Können Sie eine Sache klären? Sie sagten: "Jedes Ergebnis-Array sollte Arrays enthalten, die die gleiche Länge wie die Anzahl der Kurse haben." Meinten Sie, dass jedes Element im Ergebnis-Array genau einen Kurs von jeder Abteilung enthalten sollte? –

Antwort

0

Hier ist eine allgemeine Kreuzprodukt-Lösung (nicht von mir, ich es irgendwo gefunden, kann mich nicht erinnern, wo, aber es gibt ein paar online verfügbar):

function crossProduct() { 
    $_ = func_get_args(); 
    if (count($_) == 0) { 
     return array(array()); 
    }     
    $a = array_shift($_);   
    $c = call_user_func_array('crossProduct', $_);   
    $r = array(); 
    foreach ($a as $v) { 
     foreach ($c as $p) { 
      $r[] = array_merge(array($v), $p); 
     } 
    } 
    return $r; 
} 

Sie werden jedoch vorverarbeitet, benötigen eine Lösung, die ein bisschen :

$allDepartmentsSections = []; 
foreach ($jsonArrayEntry as $entry) { 
     $sections = []; 
     foreach ($entry["section"] as $section) { 
       $sections[] = $section + [ "department" => $entry["department"], "name"=>$entry["name"] ]; 
     } 
     $allDepartmentsSections[] = $sections; 
} 

anschließend können Sie tun:

call_user_func_array('crossProduct', $allDepartmentsSections); 

sehen Sie es bei https://eval.in/725763

Arbeits
+0

Genau das, was ich brauchte. Vielen Dank! –

0

Hier ist meine Lösung:

//simplified json for answer, you could use yours 
$json = '[ 
    { 
     "department": "CIS", 
     "sections": [ 
      { 
       "sectionNumber": "CIS-1" 
      }, 
      { 
       "sectionNumber": "CIS-2" 
      } 
     ] 
    },{ 
     "department": "ENG", 
     "sections": [ 
      { 
       "sectionNumber": "ENG-1" 
      }, 
      { 
       "sectionNumber": "ENG-2" 
      } 
     ] 
    }, 
    { 
     "department": "MATH", 
     "sections": [ 
      { 
       "sectionNumber": "MATH-1" 
      }, 
      { 
       "sectionNumber": "MATH-2" 
      } 
     ] 
    } 
]'; 

$data = json_decode($json, true); 
$cartesian = []; 

//Use array map to run over all array items 
array_map(function($item) use($data, &$cartesian) { 
    //starting from your element, search for all others "next departments" 
    for($i = array_search($item, $data)+1, $c = count($data); $i<$c; $i++) { 
     //foreach "next departments" get section 
     foreach($data[$i]['sections'] as $section) { 
      //foreach sections of current department, do 
      foreach($item['sections'] as $item_section) { 
       //append to cartesian resultset 
       $cartesian[] = [$item_section, $section]; 
      } 
     } 
    } 
}, $data); 

//create a reverse array, to get all reverse combinations. 
// Ex.: We have CIS-1 -> MATH-1, now we have MATH-1 -> CIS-1 
$reverse = array_map('array_reverse', $cartesian); 
//merge to cartesian resultset 
$cartesian = array_merge($cartesian, $reverse); 

print_r(count($cartesian)); print_r($cartesian); 

Ausgabe:

24 

    Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => CIS-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => ENG-1 
       ) 

     ) 

    [1] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => CIS-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => ENG-1 
       ) 

     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => CIS-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => ENG-2 
       ) 

     ) 

    [3] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => CIS-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => ENG-2 
       ) 

     ) 

    [4] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => CIS-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => MATH-1 
       ) 

     ) 

    [5] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => CIS-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => MATH-1 
       ) 

     ) 

    [6] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => CIS-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => MATH-2 
       ) 

     ) 

    [7] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => CIS-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => MATH-2 
       ) 

     ) 

    [8] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => ENG-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => MATH-1 
       ) 

     ) 

    [9] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => ENG-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => MATH-1 
       ) 

     ) 

    [10] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => ENG-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => MATH-2 
       ) 

     ) 

    [11] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => ENG-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => MATH-2 
       ) 

     ) 

    [12] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => ENG-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => CIS-1 
       ) 

     ) 

    [13] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => ENG-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => CIS-2 
       ) 

     ) 

    [14] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => ENG-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => CIS-1 
       ) 

     ) 

    [15] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => ENG-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => CIS-2 
       ) 

     ) 

    [16] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => MATH-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => CIS-1 
       ) 

     ) 

    [17] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => MATH-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => CIS-2 
       ) 

     ) 

    [18] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => MATH-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => CIS-1 
       ) 

     ) 

    [19] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => MATH-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => CIS-2 
       ) 

     ) 

    [20] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => MATH-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => ENG-1 
       ) 

     ) 

    [21] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => MATH-1 
       ) 

      [1] => Array 
       (
        [sectionNumber] => ENG-2 
       ) 

     ) 

    [22] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => MATH-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => ENG-1 
       ) 

     ) 

    [23] => Array 
     (
      [0] => Array 
       (
        [sectionNumber] => MATH-2 
       ) 

      [1] => Array 
       (
        [sectionNumber] => ENG-2 
       ) 

     ) 

) 
+0

Danke für die Lösung –

Verwandte Themen