I'm trying to come up with an algorithm in PHP to get all the combinations for a nested array:
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
                )
        )
)
So I would get something back like:
-rough, shiney, Large
-rough, shiney, Small
-rough, shiney, Medium
-rough, shiney, Very Large
-smooth, shiney, Large
-smooth, shiney, Small
-smooth, shiney, Medium
-smooth, shiney, Very Large
etc (should be 24 in this example)
I've tried through various foreach examples and some basic recursive function, but I seem to be getting no where fast. If anyone could give a basic outline of how to solve this I'd be very grateful, thanks!
I just wrote this, that works for arrays of any length..
<?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: Improved the code a bit..
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With