在PHP中需要多个数组的所有唯一组合

时间:2019-03-12 14:43:04

标签: php laravel algorithm

首先,我浏览了该站点上的许多类似问题/答案,但没有找到我可以使用或修改用于此问题的任何类型的解决方案。有很多与此有关的事情。我接近了,但它一直用不完内存或其他资源,所以我在这里。

我需要创建一个接受一组数组并返回具有特定规则集的所有组合的函数。因此,我先拉阵列。各种长度都有9个开始。数组中的4个是其他4个单独数组的重复集合。这是我如何拉动数组的开始,以便您对数据的外观有所了解。

$prodA1 = Products::where('type','a')->pluck('id')->toArray();
$prodA2 = Products::where('type','a')->pluck('id')->toArray();
$prodB1 = Products::where('type','b')->pluck('id')->toArray();
$prodB2 = Products::where('type','b')->pluck('id')->toArray();
$prodC1 = Products::where('type','c')->pluck('id')->toArray();
$prodC2 = Products::where('type','c')->pluck('id')->toArray();
$prodD1 = Products::where('type','d')->pluck('id')->toArray();
$prodD2 = Products::where('type','d')->pluck('id')->toArray();
$prodE = Products::where('type','e')->pluck('id')->toArray();

我需要将所有数组集都设置为array('prodA1','prodA2','prodB1','prodB2','prodC1','prodC2','prodD1','prodD2','prodE')值是ID,而不是数组的名称。

每个返回的数组必须是唯一的

每个单独的数组可以有多达96个id,但它们都不同

我发现了下面的函数,如果我在上面添加了take(5),那么它会限制输出,似乎至少会产生所有组合,然后我可以将其他规则应用于该组合,但要花很长时间才能运行。这是我得到的最接近的结果,必须对此有一个更快的解决方案。任何帮助将不胜感激。

public function combinations($arrays, $i = 0) {
        if (!isset($arrays[$i])) {
            return array();
        }
        if ($i == count($arrays) - 1) {
            return $arrays[$i];
        }

        // get combinations from subsequent arrays
        $tmp = $this->combinations($arrays, $i + 1);

        $result = array();

        // concat each array from tmp with each element from $arrays[$i]
        foreach ($arrays[$i] as $v) {
            foreach ($tmp as $t) { 
                    $result[] = is_array($t) ? 
                        array_merge(array($v), $t) :
                        array($v, $t);
            }
        }

        return $result;
    }

编辑: 输入的伤口是一组9个数组,其中包含id。例如:

$prodA1 = array(1,2,3,4,5);
$prodA2 = array(1,2,3,4,5);
$prodB1 = array(6,7,8,9);
$prodB2 = array(6,7,8,9);
$prodC1 = array(10,11,12,13);
$prodC2 = array(10,11,12,13);
$prodD1 = array(14,15,16,17);
$prodD2 = array(14,15,16,17);
$prodE = array(18,19,20,21);

返回看起来像

array(1,2,6,7,10,11,14,15,18)
array(1,4,6,8,10,12,14,16,18)

因此所有结果都是唯一的,每个结果将包含9个值,这些值由2个prodA,2个prodB,2个prodC,2个prodD和1个prodE组成

希望可以将其清除一点。

0 个答案:

没有答案