PHP 根据数组元素生成全部排列组合

	/**
	 * 返回给的数组的所有组合
	 * @email kavtong@163.com
	 * @param array $orignal 多维数组
	 *      $orignal = array(
	 *              array(1,2,3),
	 *              array(4,5,6),
	 *              array(7,8,9),
	 *      );
	 * @return array(
	 *              array(1,4,7),
	 *              array(1,4,8),
	 *              array(1,4,9),
	 *              ...
	 *              array(3,6,7),
	 *              array(3,6,8),
	 *              array(3,6,9),
	 *          );
	 *  数组元素共: 3*3*3 = 27个
	 */
	public function getPermutation(array $orignal = []) {
		// 排除非数组的参数
		if (!is_array($orignal)) {
			return [];
		}

		// 排除空数组
		if (empty($orignal)) {
			return [];
		}

		// 排除只有一个元素的数组
		if (count($orignal) < 2) {
			// 返回的目标数组
			$targetTmp = array_shift($orignal);
			// 返回结果集
			return is_array($targetTmp) ? $targetTmp : [];
		}
		// 构建目标数组
		$target = array_shift($orignal);
		// 目标数组第一个元素格式化为数组
		$target = is_array($target) ? $target : [];
		// 下一个需要处理的数组
		$tmp = array_shift($orignal);
		// 非正常数据标识
		$invalideParam = false;
		// 数组且不为空
		while (is_array($tmp) && !empty($tmp)) {
			// 验证参数是否是一维数组
			if (count($tmp) != count($tmp, COUNT_RECURSIVE)) {
				$invalideParam = true;
				break;
			}
			/**
			 * 原始数组的循环
			 * array(
			 *      0 =>1,
			 *      1 =>2,
			 *      2 =>3,
			 * );
			 */
			// 目标数组的临时变量
			$targetTmp = [];
			foreach ($target as $value) {
				foreach ($tmp as $v) {
					// 临时数组变量
					$targetTmp[] = array_merge((array) $value, [$v]);
				}
			}
			// 原始数组的替换
			$target = $targetTmp;
			// 移动数组的下一个元素
			$tmp = array_shift($orignal);
		}
		// 存在非一维数组项
		if ($invalideParam) {
			return [];
		}
		// 返回结果集
		return is_array($target) ? $target : [];
	}

}