<?php
// generic function to generate cross product of multi-dimensional array
function arrayCrossProduct( array $data ) {
$rowCount = 1;
foreach( $data as &$datum ) {
$datum = (array) $datum;
$rowCount *= count( $datum );
reset( $datum ); // reset the array, just to be sure
}
unset( $datum ); // drop the reference, just to be safe
$result = array();
while( $rowCount-- > 0 ) {
$row = array();
foreach( $data as &$datum ) {
$row[] = current( $datum );
}
$result[] = $row;
foreach( $data as &$datum ) {
next( $datum );
if( !is_null( key( $datum ) ) ) {
break;
}
reset( $datum );
}
}
return $result;
}
// example data
$data = array(
'name' => 'Mike',
'country' => 'UK',
'prefers' => array( 'coffee', 'milk', 'bananas' ),
'age' => 25,
'parents' => array( 'John', 'Janine' ),
'children' => array( 'Jack', 'Jill', 'Joline' )
);
$i = 1;
foreach( arrayCrossProduct( $data ) as $row ) {
echo str_pad( (string) $i++, 2, " ", STR_PAD_LEFT ) . '. ' . implode( ', ', $row ) . PHP_EOL;
}
preferences:
58.22 ms | 402 KiB | 5 Q