Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP中每个子数组中的一个值生成所有可能的组合?_Php_Arrays_Iterator_Iteration_Nested Loops - Fatal编程技术网

如何使用PHP中每个子数组中的一个值生成所有可能的组合?

如何使用PHP中每个子数组中的一个值生成所有可能的组合?,php,arrays,iterator,iteration,nested-loops,Php,Arrays,Iterator,Iteration,Nested Loops,我的任务显然很简单,但我被卡住了。我尝试过重构和迭代器,但没有任何想法打动我。他们说一张图片胜过千言万语,所以我将展示我的“图片”示例数组: array (size=4) 0 => array (size=4) 0 => int 1 1 => int 2 2 => int 3 3 => int 4 1 => array (size=3) 0 => string 'a' (

我的任务显然很简单,但我被卡住了。我尝试过重构和迭代器,但没有任何想法打动我。他们说一张图片胜过千言万语,所以我将展示我的“图片”示例数组:

array (size=4)
  0 =>
    array (size=4)
      0 => int 1
      1 => int 2
      2 => int 3
      3 => int 4
  1 =>
    array (size=3)
      0 => string 'a' (length=1)
      1 => string 'b' (length=1)
      2 => string 'c' (length=1)
  2 =>
    array (size=3)
      0 => string 'X' (length=1)
      1 => string 'Y' (length=1)
      2 => string 'Z' (length=1)
  3 =>
    array (size=5)
      0 => string '!' (length=1)
      1 => string '"' (length=1)
      2 => string '#' (length=1)
      3 => string '$' (length=1)
      4 => string '%' (length=1)
规则:

  • 数组大小和子数组大小是随机的,而且相当大
  • 任何子数组中只能使用一个值
  • 结果应按从最短字符串到最长字符串的顺序排列
  • 必须节省内存,因为生成了大量数据,结果应该离线存储/比较,比如文件或mysql数据库。但每次都是这样
  • 所需字符串组合的示例:

    1
    2
    3
    4
    a
    b
    c
    X ...
    1a
    1b
    1c
    2a
    2b ...
    aX!
    aX" ...
    1aX!
    1aX" .......
    4cZ%
    

    我尝试了几个迭代器,比如。

    在我的例子中,解决方案是这个递归函数,我切换
    $combine
    变量,首先从数组中插入单个值,然后将combine设置为true,以合并数据库中的所有值(除了包含当前迭代值的值):

    函数iterdb($arrays,$i=0,$combine=false){
    if(!isset(数组_键($arrays)[$i])){
    返回false;
    }
    如果($i==0&&$combine==true){
    //添加空选项以获取所有组合
    对于($x=0;$xiterdb($arrays,$i+1,$combine);//对以下每个数组调用迭代
    $transactions=array();
    排序($array[$i]);
    $this->log('Iterating array'.$i.'using combine'.($combine?'True':'False');
    foreach($array[array_key($array)[$i]]作为$v){
    如果($this->counter>0){
    如果($combine==false){
    $transactions[]=“将IGNORE插入scout_查询(scout,查询)值(“$this->Class.”,“$v”);
    }否则{
    $tmp=$this->querys->find(数组)(
    'scout=:scout和query不象:query',
    ':scout'=>$this->Class,
    “:查询“=>”%。(数组_值(分解(“=”,$v))[0])。”
    ),数组('order'=>'CHAR_LENGTH(query)DESC');
    foreach(tmp为$t){
    $transactions[]=“将忽略插入到scout_查询(scout,query)值(“$this->Class.”,“$t->query.”和$v');
    $transactions=$this->saveTransactions($transactions);
    }
    }
    }
    $transactions=$this->saveTransactions($transactions,true);
    }
    如果($i==0&&$combine==false){
    返回$this->iterdb($arrays,0,true);
    }
    }
    
    那么每行的长度在1和数组中的元素数之间?你想要所有可能的组合,还是仅仅几个,比如100个?所有组合,数组大小都是随机的,一个元素最多可以有15000行,一个数组最多可以有50个元素。这里似乎没有一个简洁的问题陈述。你能在第一段中总结它吗?展示你的代码。
                function iterdb( $arrays, $i = 0, $combine = false ) {
                    if ( ! isset( array_keys( $arrays )[ $i ] ) ) {
                        return false;
                    }
                    if ( $i == 0 && $combine === true ) {
                        //Adding empty option to obtain all combos
                        for ( $x = 0; $x < count( $arrays ); $x ++ ) {
                            $arrays[ $x ][] = preg_replace( '`=[^\&]+`', '=', $arrays[ $x ][0] );
                        }
                    }
    
                    $this->iterdb( $arrays, $i + 1, $combine );//Call iteration on each following array
                    $transactions = array();
                    sort( $arrays[ $i ] );
                    $this->log( 'Iterating array ' . $i . ' using combine ' . ( $combine ? 'True' : 'False' ) );
                    foreach ( $arrays[ array_keys( $arrays )[ $i ] ] as $v ) {
                        if ( $this->counter > 0 ) {
                            if ( $combine === false ) {
                                $transactions[] = "INSERT IGNORE INTO scout_queries (scout,query) VALUES ('" . $this->Class . "','$v')";
                            } else {
                                $tmp = $this->queries->find( array(
                                    'scout = :scout and query NOT LIKE :query',
                                    ':scout' => $this->Class,
                                    ':query' => '%' . ( array_values( explode( '=', $v ) )[0] ) . '%'
                                ), array( 'order' => 'CHAR_LENGTH(query) DESC' ) );
    
                                foreach ( $tmp as $t ) {
                                    $transactions[] = "INSERT IGNORE INTO scout_queries (scout,query) VALUES ('" . $this->Class . "','" . $t->query . "&$v')";
                                    $transactions   = $this->saveTransactions( $transactions );
                                }
                            }
    
                        }
                        $transactions = $this->saveTransactions( $transactions, true );
                    }
    
    
                    if ( $i == 0 && $combine === false ) {
                        return $this->iterdb( $arrays, 0, true );
                    }
                }