Мне нужно было сделать то же самое, и я попробовал предыдущие решения, опубликованные здесь, но не смог заставить их работать. Я получил образец от этого умного парня http://www.php.net/manual/en/ref.array.php#54979. Однако, его образец не справился с концепцией отсутствия повторяющихся комбинаций. Так что я включил эту часть. Вот моя модифицированная версия, надеюсь, она поможет:
$data = array(
array('apples', 'pears', 'oranges'),
array('steve', 'bob')
);
$res_matrix = $this->array_cartesian_product( $data );
foreach ( $res_matrix as $res_array )
{
foreach ( $res_array as $res )
{
echo $res . " - ";
}
echo "<br/>";
}
function array_cartesian_product( $arrays )
{
$result = array();
$arrays = array_values( $arrays );
$sizeIn = sizeof( $arrays );
$size = $sizeIn > 0 ? 1 : 0;
foreach ($arrays as $array)
$size = $size * sizeof( $array );
$res_index = 0;
for ( $i = 0; $i < $size; $i++ )
{
$is_duplicate = false;
$curr_values = array();
for ( $j = 0; $j < $sizeIn; $j++ )
{
$curr = current( $arrays[$j] );
if ( !in_array( $curr, $curr_values ) )
{
array_push( $curr_values , $curr );
}
else
{
$is_duplicate = true;
break;
}
}
if ( !$is_duplicate )
{
$result[ $res_index ] = $curr_values;
$res_index++;
}
for ( $j = ( $sizeIn -1 ); $j >= 0; $j-- )
{
$next = next( $arrays[ $j ] );
if ( $next )
{
break;
}
elseif ( isset ( $arrays[ $j ] ) )
{
reset( $arrays[ $j ] );
}
}
}
return $result;
}
Результат будет примерно таким:
яблоки - Стив
яблоки - боб
груши - Стив
груши - боб
апельсины - Стив
апельсины - боб
Если массив данных выглядит примерно так:
$data = array(
array('Amazing', 'Wonderful'),
array('benefit', 'offer', 'reward'),
array('Amazing', 'Wonderful')
);
Тогда будет напечатано что-то вроде этого:
Удивительно - выгода - Замечательно
Удивительно - предложение - Замечательно
Удивительно - награда - Замечательно
Замечательно - выгодно - Удивительно
Замечательно - предложение - Удивительно
Замечательно - награда - Удивительно