2012-02-14 5 views
6

Sto cercando di venire con un algoritmo in PHP per ottenere tutte le combinazioni per un array nidificato:Ottenere tutte le combinazioni da più matrici nidificate

Array 
(
    [0] => Array 
     (
      [0] => Option Object 
       (
        [strValue] => rough 
       ) 

      [1] => Option Object 
       (
        [strValue] => smooth 
       ) 

      [2] => Option Object 
       (
        [strValue] => coarse 
       ) 

     ) 

    [1] => Array 
     (
      [0] => Option Object 
       (
        [strValue] => shiney 
       ) 

      [1] => Option Object 
       (
        [strValue] => mat 
       ) 

     ) 

    [2] => Array 
     (
      [0] => Option Object 
       (
        [strValue] => Large 
       ) 

      [1] => Option Object 
       (
        [strValue] => Medium 
       ) 

      [2] => Option Object 
       (
        [strValue] => Small 
       ) 

      [3] => Option Object 
       (
        [strValue] => very large 
       ) 

     ) 

) 

quindi vorrei ottenere qualcosa di simile:

-rough, shiney, Grande

-rough, shiney, Piccolo

-rough, shiney, medio

-rough, shiney, Very Large

-liscia, shiney, Grande

-liscia, shiney, Piccolo

-liscia, shiney, Medio

-liscia, shiney, Very Large

etc (dovrebbe essere 24 in questo esempio)

ho provato attraverso vari esempi foreach e qualche func ricorsiva di base zione, ma mi sembra di non arrivare dove veloce. Se qualcuno potesse fornire una descrizione di base su come risolverlo sarei molto grato, grazie!

+1

e come esattamente è il codice (che sarebbe idealmente aggiunto alla domanda) in mancanza? Perché a prima vista un set di 3 loop annidati dovrebbe essere tutto ciò che è necessario per risolvere il tuo problema. – fvu

+1

Non direi che gli array sono nidificati, necessariamente. Sono tutti contenuti in un array principale, ma non sono nidificati l'uno rispetto all'altro. Ma per creare un [prodotto cartesiano] (http://en.wikipedia.org/wiki/Cartesian_product) utilizzandoli tutti, si vogliono i cicli * annidati *. – JYelton

+0

possibile duplicato di [Ricerca di prodotti cartesiani con array associativi PHP] (http://stackoverflow.com/questions/6311779/finding-cartesian-product-with-php-associative-arrays) – deceze

risposta

8

Ho appena scritto questo, che funziona per gli array di qualsiasi lunghezza ..

<?php 

function cartesian_product($a) { 
    $result = array(array()); 
    foreach ($a as $list) { 
    $_tmp = array(); 
    foreach ($result as $result_item) { 
     foreach ($list as $list_item) { 
     $_tmp[] = array_merge($result_item, array($list_item)); 
     } 
    } 
    $result = $_tmp; 
    } 
    return $result; 
} 


// Let's test this..                                              

header('Content-type: text/plain'); 

$a = array(
    array('rough','smooth','coarse'), 
    array('shiney','mat'), 
    array('small','medium','large','x-large'), 
); 

$result = cartesian_product($a); 
foreach ($result as $row) { 
    print implode(", ", $row) ."\n"; 
} 

edit: Migliorato il codice un po '..

+0

Oh, e solo fyi, in Python lo si farebbe: http://stackoverflow.com/questions/533905/get-the-cartesian-product-of-a -series-of-lists-in-python :) – redShadow

+0

Funziona a meraviglia, grazie! – wonza

0

Qui è la forza bruta (peggiore efficienza) algoritmo in pseudo-PHP:

$array1 = $array[0]; 
$array2 = $array[1]; 
$array3 = $array[2]; 

$results = array(); 
for($i = 0; $i < count($array1); $i++) 
    for($j = 0; $j < count($array2); $j++) 
     for($k = 0; $k < count($array3); $k++) 
      $results[] = $array1[$i] . ',' . $array2[$j] . ',' . $array3[$k]; 
+0

Come ho appena commentato sopra, non è necessariamente solo 3 foreach necessario. Quanto sopra può avere un numero qualsiasi di elementi extra, questo è dinamico, quindi non posso limitarlo a 3 nested for/foreach – wonza

+0

Oh, mio ​​errore. Il tuo titolo è fuorviante, in quanto dice specificamente 3 matrici. – nickb

+0

ah, proprio così. Scusate! – wonza

1

Tempo a nidificare alcuni loop foreach!

<?php 
$array1 = array('rough', 'smooth', 'coarse'); 
$array2 = array('shiny', 'matte'); 
$array3 = array('very large', 'large', 'medium', 'small'); 

foreach($array1 as $i) 
    foreach($array2 as $j) 
     foreach($array3 as $k) 
      $output[] = "$i, $j, $k"; 

var_dump($output); 
/* ouput 
array 
    0 => string 'rough, shiny, very large' (length=24) 
    1 => string 'rough, shiny, large' (length=19) 
    2 => string 'rough, shiny, medium' (length=20) 
    3 => string 'rough, shiny, small' (length=19) 
    4 => string 'rough, matte, very large' (length=24) 
    5 => string 'rough, matte, large' (length=19) 
    6 => string 'rough, matte, medium' (length=20) 
    7 => string 'rough, matte, small' (length=19) 
    8 => string 'smooth, shiny, very large' (length=25) 
    9 => string 'smooth, shiny, large' (length=20) 
    10 => string 'smooth, shiny, medium' (length=21) 
    11 => string 'smooth, shiny, small' (length=20) 
    12 => string 'smooth, matte, very large' (length=25) 
    13 => string 'smooth, matte, large' (length=20) 
    14 => string 'smooth, matte, medium' (length=21) 
    15 => string 'smooth, matte, small' (length=20) 
    16 => string 'coarse, shiny, very large' (length=25) 
    17 => string 'coarse, shiny, large' (length=20) 
    18 => string 'coarse, shiny, medium' (length=21) 
    19 => string 'coarse, shiny, small' (length=20) 
    20 => string 'coarse, matte, very large' (length=25) 
    21 => string 'coarse, matte, large' (length=20) 
    22 => string 'coarse, matte, medium' (length=21) 
    23 => string 'coarse, matte, small' (length=20) 
*/ 
?> 
+0

grazie per aver fornito l'output che ha reso la risposta facile da convalidare – Ananda