jjzjj

php - 比较PHP中两个数组中所有可能的元素对组合

coder 2024-04-20 原文

我正在尝试用 PHP 进行基本的二进制线分类。 (与编程语言无关,只是更适合使用 PHP)。

所以基本上我有 2 个坐标数组:

$classA = [ new Point(1,1), new Point(1,2), new Point(3,3), new Point(1,5) ];
$classB = [ new Point(4,1), new Point(5,2), new Point(4,1), new Point(6,6) ];

我需要遍历这些数组并每次获得 2 对点(一对由来自 classA 的点和来自 classB 的另一个点组成)。获得所有可能的组合很重要。一旦一个特定的点在一对中,它就不能出现在另一对中。

例如前两对是:

$pair1 = [$a[0], $b[0]];
$pair2 = [$a[1], $b[1]];

为了更好地解释我自己,这就是我需要的:

当第一对包含 [1,1] 和 [4,1] 时,另一对的所有可能组合都以黄色突出显示。

到目前为止,这是我所拥有的:

$classA = [ new Point(1,1), new Point(1,2), new Point(3,3)];
$classB = [ new Point(4,1), new Point(5,2), new Point(4,1)];

$combinations = [];
$pair1 = [];
$pair2 = [];

$n = count($classA);
$m = count($classB);

for ($i=0; $i<$n; $i++){

    for ($j=0; $j<$m; $j++){

        $pair1 = [ $classA[$i], $classB[$j] ];

        for ($z=0; $z<$n; $z++){

            if($z != $i && $z != $j){
                for ($y=0; $y<$m; $y++){
                    if($y != $i && $y != $j){

                        $pair2 = [ $classA[$z], $classB[$y] ];
                        $combinations[] = [$pair1, $pair2];

                    }
                }
            }

        }
    }
}

除了效率低下之外,这给了我很多重复项,有没有办法只获得唯一的组合?

最佳答案

我建议首先创建所有可能的组合,然后对于每一对,在“所有可能的组合”中用 null-s 替换行/列,虽然它可能不是最快的,但它应该工作并给出你大概的想法

$allCombinations = Array();
foreach($classA as $value) {
    $column = Array();
    foreach($classB as $bPart) {
        $column[] = Array($bPart,$value);
    }
    $allCombinations[] = $column;
}

$possibleCombinations = Array();

$sizeA = count($classA);
$sizeB = count($classB);

for($a = 0; $a < $sizeA; $a++) {
    $column = Array();
    for($b = 0; $b < $sizeB; $b++) {
        $temp = $allCombinations;

        for($i = 0;$i < $sizeA;$i++) {
            $temp[$a][$i] = null;
        }

        for($i = 0;$i < $sizeB;$i++) {
            $temp[$i][$b] = null;
        }       

        // for $classA[$a] , $classB[$b] possible combinations are in temp now
        $column[] = $temp;
    }
    $possibleCombinations[] = $column;
}

现在,在 $possibleCombinations 中,您可以看到给定 A/B 索引的可能组合是什么

在第一个循环中,它只是创建所有可能的组合, 在第二个循环中,它将首先获取 A 和 B 值,复制所有组合数组,然后将列 A 和行 B 值设置为 null(因为它们不能使用,对吧?),最后将这些可能的组合存储在 $temp 中并添加到 $possibleCombinations,

例子:

$ab = Array($classA[$i],$classB[$j]);
$possibleCombinationsForAB = $possibleCombinations[$i,$j];

关于php - 比较PHP中两个数组中所有可能的元素对组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33346600/

有关php - 比较PHP中两个数组中所有可能的元素对组合的更多相关文章

  1. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  7. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  8. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  9. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  10. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

随机推荐