This is way off-beam, but the other way you can get a cartesian product is
using a relational database.
Suppose you have a table for each option group eg colours and sizes
Then you go
  select colours.*,sizes.*
  from colours,sizes
and away you go.
Of course you can extend that to several more tables.  If someone wants S /
Red or Red / S, you just add a where-clause to the above with the two
conditions using AND.
I find a use for this sort of join once every... uhm .. decade I suppose.

-- 
Daniel Bush

http://blog.web17.com.au
http://github.com/danielbush


2009/4/1 Torm3nt <[email protected]>

>
> God I LOVE you guys! lol
>
> That's the exact term I needed - cartesian product. Simple google
> search got me exactly what I needed.
>
> AHHH. I could hug you all! :D
>
>
> Kirk
>
> On Wed, Apr 1, 2009 at 4:12 PM, Xavier Shay <[email protected]> wrote:
> >
> > I solve exactly the same problem you're trying to with the below method
> > (cartesian product)
> >
> > There's a few implementations around the net, I'd be surprised if there
> > isn't one for PHP.
> >
> > Julian Doherty wrote:
> >> So you basically want a cartesian product of an arbitrary list of lists?
> >>
> >> The Ruby facets gem does
> >> that:
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD
> >>
> >> Heres what the Ruby code looks like (works for an arbitrary number of
> >> list arguments):
> >>
> >> class Array
> >> 2
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l2
> >
> >>
> >> 3
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l3
> >
> >>   if RUBY_VERSION < '1.9'
> >> 4
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l4
> >
> >>
> >> 5
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l5
> >
> >>     # Provides the cartesian product of two or more arrays.
> >> 6
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l6
> >
> >>     #
> >> 7
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l7
> >
> >>     #   a = []
> >> 8
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l8
> >
> >>     #   [1,2].product([4,5])
> >> 9
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l9
> >
> >>     #   a  #=> [[1, 4],[1, 5],[2, 4],[2, 5]]
> >> 10
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l10
> >
> >>     #
> >> 11
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l11
> >
> >>     # CREDIT: Thomas Hafner
> >> 12
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l12
> >
> >>
> >> 13
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l13
> >
> >>     def product(*enums)
> >> 14
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l14
> >
> >>       enums.unshift self
> >> 15
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l15
> >
> >>       result = [[]]
> >> 16
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l16
> >
> >>       while [] != enums
> >> 17
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l17
> >
> >>         t, result = result, []
> >> 18
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l18
> >
> >>         b, *enums = enums
> >> 19
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l19
> >
> >>         t.each do |a|
> >> 20
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l20
> >
> >>           b.each do |n|
> >> 21
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l21
> >
> >>             result << a + [n]
> >> 22
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l22
> >
> >>           end
> >> 23
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l23
> >
> >>         end
> >> 24
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l24
> >
> >>       end
> >> 25
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l25
> >
> >>       result
> >> 26
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l26
> >
> >>     end
> >> 27
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l27
> >
> >>
> >> 28
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l28
> >
> >>   end
> >> 29
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l29
> >
> >>
> >> 30
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l30
> >
> >>   # Operator alias for cross-product.
> >> 31
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l31
> >
> >>   #
> >> 32
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l32
> >
> >>   #   a = [1,2] ** [4,5]
> >> 33
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l33
> >
> >>   #   a  #=> [[1, 4],[1, 5],[2, 4],[2, 5]]
> >> 34
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l34
> >
> >>   #
> >> 35
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l35
> >
> >>   # CREDIT: Trans
> >> 36
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l36
> >
> >>
> >> 37
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l37
> >
> >>   alias_method :**, :product
> >> 38
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l38
> >
> >>
> >> 39
> >> <
> http://facets.rubyforge.org/git?p=facets.git;a=blob;f=lib/core/facets/array/product.rb;h=f890ddc0ddd7e7f5076f207d0cc126b7bf34ceea;hb=HEAD#l39
> >
> >> end
> >>
> >> I'm guessing that wouldn't be too hard to port to PHP
> >>
> >> Cheers
> >> Julian Doherty
> >>
> >> >
> >
> >
> > >
> >
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
or Rails Oceania" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rails-oceania?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to