Skip to content

Instantly share code, notes, and snippets.

@jwage
Created April 22, 2014 20:30
Show Gist options
  • Save jwage/11193216 to your computer and use it in GitHub Desktop.
Save jwage/11193216 to your computer and use it in GitHub Desktop.
PHP Cartesian Function
<?php
$attributeValues = array(
'color' => array('Red', 'White', 'Blue'),
'size' => array(1, 2, 3, 4),
'fabric' => array('Cloth', 'Silk')
);
class Cartesian
{
public static function build($set)
{
if (!$set) {
return array(array());
}
$subset = array_shift($set);
$cartesianSubset = self::build($set);
$result = array();
foreach ($subset as $value) {
foreach ($cartesianSubset as $p) {
array_unshift($p, $value);
$result[] = $p;
}
}
return $result;
}
}
print_r(Cartesian::build($attributeValues));
@jwage
Copy link
Author

jwage commented Apr 18, 2015

👍

@jamshedhossan9
Copy link

jamshedhossan9 commented Aug 16, 2017

If i need a certain amount of data, what should i do?
suppose i need maximum 20 data instead of 24 from you above example, then what should i do?

@crona2011
Copy link

crona2011 commented Aug 25, 2017

There looks to be 24 combinations; for the universe to balanced 24 must be returned. If you do not want all of them you can slice off the ones you don't want. $array = array_slice($array, 0, 20); or $array = array_slice($array, 4, 24);.

@crona2011
Copy link

crona2011 commented Aug 25, 2017

btw @jwage

return CartesianProduct::build([
      $this->xmlProvider()[0],
      $this->validElementNameProvider()[0],
      $this->invalidElementNameProvider()[0]
]);

nice one.

@ostrolucky
Copy link

Here's pretty interesting implementation https://github.com/PatchRanger/cartesian-iterator

@ganesha316
Copy link

ganesha316 commented Sep 24, 2020

Amazing. Thanks a Ton

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment