笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尓积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员
对任意集合A,根据定义有
AxΦ =Φ , Φ xA=Φ
php代码示例:
/**
** 实现二维数组的笛卡尔积组合
** $arr 要进行笛卡尔积的二维数组
** $str 最终实现的笛卡尔积组合,可不写
** @return array
**/
function cartesian($arr, $str = [])
{
//去除第一个元素
$first = array_shift($arr);
//判断是否是第一次进行拼接
if (count($str) > 1)
{
foreach ($str as $k => $val)
{
foreach ($first as $key => $value)
{
//最终实现的格式 1,3,76
//可根据具体需求进行变更
$str2[] = $val . ‘,’ . $value;
}
}
}
else
{
foreach ($first as $key => $value)
{
//最终实现的格式 1,3,76
//可根据具体需求进行变更
$str2[] = $value;
}
}
//递归进行拼接
if (count($arr) > 0)
{
$str2 = cartesian($arr, $str2);
}
//返回最终笛卡尔积
return $str2;
}
示例2
/**
* 计算多个集合的笛卡尔积
*
* @param Array $sets 集合数组
*
* @return Array
*/
function CartesianProduct($sets)
{
// 保存结果
$result = [];
// 循环遍历集合数据
for ($i = 0, $count = count($sets); $i < $count – 1; $i ++)
{
// 初始化
if ($i == 0)
{
$result = $sets[$i];
}
// 保存临时数据
$tmp = [];
// 结果与下一个集合计算笛卡尔积
foreach ($result as $res)
{
foreach ($sets[$i + 1] as $set)
{
$tmp[] = $res . ‘,’ . $set;
}
}
// 将笛卡尔积写入结果
$result = $tmp;
}
return $result;
}
示例3:
function dikaer($arr)
{
$arr1 = [];
$result = array_shift($arr);
while ($arr2 = array_shift($arr))
{
$arr1 = $result;
$result = [];
foreach ($arr1 as $v)
{
foreach ($arr2 as $v2)
{
if (!is_array($v))
{
$v = [$v];
}
if (!is_array($v2))
{
$v2 = [$v2];
}
$result[] = array_merge_recursive($v, $v2);
}
}
}
return $result;
}或
function dikaer2($arr)
{
$arr1 = [];
$result = array_shift($arr);
while ($arr2 = array_shift($arr))
{
$arr1 = $result;
$result = [];
foreach ($arr1 as $v)
{
foreach ($arr2 as $v2)
{
$result[] = $v . ‘,’ . $v2;
}
}
}
return $result;
}
结果示例:
转载请注明:苏demo的别样人生 » php实现笛卡尔积算法示例