<?php

error_reporting(-1);
mb_internal_encoding('utf-8');



function generateVariation($A, $i = 0){
	
    $result = array();
	
    if ($i < count($A)){
        $variations = generateVariation($A, $i + 1);

        for ($j = 0; $j < count($A[$i]); $j++){
            if ($variations){
                foreach ($variations as $variation){
                    $result[] = array_merge(array($A[$i][$j]), $variation);
                        }
            }else{
				$result[] = array($A[$i][$j]);
			}
		}
		return $result;
	}
}
	
$A = array(
    0 => array(1),
    1 => array(1,2,3),
    2 => array(4,5,6)
  );

print_r(generateVariation($A, $i = 0));