2017-01-27 5 views
2

Je suis en train d'obtenir toutes les combinaisons possibles pour un nombre inconnu de tableaux en tant que tels:Obtenez toutes les combinaisons de tableaux uniques en utilisant PHP produit cartésien

Voici la structure de données JSON

[ 
    { 
     "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 J'aimerais que le résultat soit le suivant: Le résultat devrait contenir tout le tableau associatif du cours afin que je puisse accéder à toutes ses données (sectionNumber, regNum, days, ..etc)

Notez, je ne sais pas combien de cours ou de sections il y aura. En outre, un cours ne devrait jamais se comparer à lui-même.

Résultat souhaité:

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

Chaque tableau de résultat doit contenir des tableaux (qui sont la même longueur que le nombre de cours) de tableaux.


Je pense que je devrais utiliser le produit cartésien, mais je ne suis pas certain sur la façon de mettre en œuvre. j'ai commencé à faire quelque chose comme ça, mais je sais qu'il est pas exact:

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

En fonction de vos contraintes de mémoire, vous pouvez utiliser une fonction récursive qui ajoute tous les éléments restants, y compris lui-même, à votre tableau de résultats. –

+0

@ChrisThorsvik Mais devrait être le tableau de résultats qui contient des tableaux contenant des tableaux. En outre, un cours ne devrait jamais se comparer à lui-même. –

+0

Pouvez-vous clarifier une chose? Vous avez dit "Chaque tableau de résultats devrait contenir des tableaux ... qui ont la même longueur que le nombre de cours". Voulez-vous dire que chaque élément du tableau des résultats doit contenir exactement un cours de chaque département? –

Répondre

0

est ici une solution multiproduits générique (pas de moi, je l'ai trouvé quelque part, ne me souviens pas où mais il y a un groupe disponible en ligne):

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; 
} 

Toutefois, vous aurez besoin de pré-traiter votre solution un peu :

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

Vous pouvez alors faire:

call_user_func_array('crossProduct', $allDepartmentsSections); 

voir travailler à https://eval.in/725763

+0

Exactement ce dont j'avais besoin. Merci beaucoup! –

0

Voici ma solution:

//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); 

Sortie:

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

Merci pour la solution –