当前位置: 首页 > 知识库问答 >
问题:

PHP:如何获得与子数组的最匹配的组合?

南门烈
2023-03-14

我有一个$myArray,子数组总是包含5个数字-数字按大小排序,不能在子数组中重复,但是$myArray中可以有更多“相同”的子数组(具有相同数字的子数组)。

$myArray = array(
array(1,2,3,4,5),
array(5,6,10,18,20),
array(1,2,3,4,5),
array(2,3,4,5,9),
array(1,2,3,7,9),
array(1,3,4,5,7),
array(2,3,4,7,9),
array(2,4,5,10,29),
array(1,8,10,11,15) // etc.
);

如何获得$n数字的组合(数组),其中该组合(或者更确切地说,由该$n数字组合生成的5个数字组合)将与$myArray的大多数子数组相匹配?

示例:$myArray$n=7的所需结果将是数组(1,2,3,4,5,7,9),因为从该结果导出的总共有二十一个5个数字组合:

1,2,3,4,5
1,2,3,4,7
1,2,3,4,9
//... and so on

这些组合将匹配几乎所有的子数组(只有第二个和最后两个子数组超出范围)。

我曾尝试使用数组\u count\u values()进行计数,但在这种情况下,所有数字的简单频率不起作用。。。

共有1个答案

羊舌兴德
2023-03-14
                        class Combinations implements Iterator
                        {
                            protected $c = null;
                            protected $s = null;
                            protected $n = 0;
                            protected $k = 0;
                            protected $pos = 0;

                            function __construct($s, $k) {
                                if(is_array($s)) {
                                    $this->s = array_values($s);
                                    $this->n = count($this->s);
                                } else {
                                    $this->s = (string) $s;
                                    $this->n = strlen($this->s);
                                }
                                $this->k = $k;
                                $this->rewind();
                            }
                            function key() {
                                return $this->pos;
                            }
                            function current() {
                                $r = array();
                                for($i = 0; $i < $this->k; $i++)
                                    $r[] = $this->s[$this->c[$i]];
                                return is_array($this->s) ? $r : implode('', $r);
                            }
                            function next() {
                                if($this->_next())
                                    $this->pos++;
                                else
                                    $this->pos = -1;
                            }
                            function rewind() {
                                $this->c = range(0, $this->k);
                                $this->pos = 0;
                            }
                            function valid() {
                                return $this->pos >= 0;
                            }
                            //
                            protected function _next() {
                                $i = $this->k - 1;
                                while ($i >= 0 && $this->c[$i] == $this->n - $this->k + $i)
                                    $i--;
                                if($i < 0)
                                    return false;
                                $this->c[$i]++;
                                while($i++ < $this->k - 1)
                                    $this->c[$i] = $this->c[$i - 1] + 1;
                                return true;
                            }
                        }







            $tickets = array(
                 array(1,2,3,4,5),
                 array(5,6,10,18,20),
                 array(1,2,3,4,5),
                 array(2,3,4,5,9),
                 array(1,2,3,7,9),
                 array(1,3,4,5,7),
                 array(2,3,4,7,9),
                 array(2,4,5,10,29),
                 array(1,8,10,11,15) // etc.
            );
    // first we need to find all numbers  that are actually in one of the arrays.

            foreach($tickets as $anArray) {
                foreach($anArray as $aNumberUsed){
                    $numbersUsed[$aNumberUsed] = $aNumberUsed;
                } 
            }
  // next we assign the number of integers in the set we are looking for.       
            $r = 7;
// next we run the above class on our array (which gets us all of the possible combinations of these numbers).
            foreach(new Combinations($numbersUsed, 7) as $comboKey => $substring){
                $comboList[$comboKey] = $substring;
                $countWins = 0;
// here we loop through all of the 5 number arrays, and flag any array who has all the variables in this iteration of the possible numbers.  There are cleaner ways to do this, but this is easy to understand.
                foreach($tickets as $valueList) {
                    $countNumbersFound = 0;
                    foreach($valueList as $value) {
                        if(in_array($value, $substring)) {
                            $countNumbersFound++;
                        }
                    }
                    if($countNumbersFound == 5) {
                        $countWins++;
                    }       
                }
                $foundCount[$comboKey] = $countWins;
            }
    $bigly = max($foundCount);


    $key = array_search($bigly, $foundCount);

    foreach($comboList[$key] as $wellDone) {
        echo "$wellDone ,";
    }   

这门课是从这里偷来的:http://www.developerfiles.com/combinations-in-php/

下课后的一切都是原创的。我不相信重新发明轮子。

 类似资料:
  • 问题内容: 是否可以将值作为数组输入? 如果我尝试使用发送链接,而我想在php端使用,那么该值如何成为数组?因为现在正在返回。它是标题链接中的最后一个ID。有什么建议么? 问题答案: 在PHP中执行此操作的通常方法是输入您的URL而不是: 然后将是这些值的数组。它不是特别漂亮,但是可以直接使用。

  • 问题内容: 我已经阅读/尝试了很多关于SO的建议答案,但没有一个能解决问题 如何获得所有可能的组合? 预期产量: 注意:我要寻找的答案应包括 所有组合和所有不同的安排 。例如: ‘Alpha Beta’ 和 ‘Beta Alpha’ 是2个不同的字符串,并且都应位于输出数组中。 提前致谢 问题答案: 我相信您的教授会更满意此解决方案: 这解决了它:

  • 问题内容: 这个问题已经在这里有了答案 : 使用Java在原始数组中查找最大值/最小值 (15个答案) 5年前关闭。 这是我的代码。我需要获取数组的最小值,最大值才能为我获取范围,无论何时输入数字,最小值均为0。请帮助我。谢谢:) 问题答案: 同样,通过更改较小的符号可以找到最小值。

  • 在坚持最佳实践的同时,如何使用firestore进行一些关系查询,我面临着一点思维障碍。我正在创建一个feed功能,在这里你可以看到来自朋友的帖子。基本上,我的数据结构如下: 基本上,我正在进行一个查询,以获取friends_uid包含我的uid(本例中为uid1)的所有朋友。然后,一旦我将所有好友uid映射到一个数组,我想进行firestore查询,以获取Post_by字段等于该好友uid数组中

  • 问题内容: 我试图获取数组中的最大值,同时仍保留项目标签。我知道我可以通过运行sort()来做到这一点,但是如果这样做,我只会丢失标签- 这对于我需要的东西毫无意义。这是数组: 有任何想法吗? 问题答案: 不要对数组进行排序以获取最大值。 获得最大值: 获取相应的密钥:

  • 我需要根据PHP中的最小值和最大值在数组中查找匹配项。如果没有详细的foreach、if、elseif、then子句,如何有效地获取匹配行? 例如给定数组(如下)和数字,如何返回数组行、和? 我希望把它变成一个函数。大概是这样的: 上述的预期结果应该是行、和。但我希望它适用于1到100之间的任何整数。