如何使用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)
规则:
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 );
}
}