Php 根据值的数量将数组拆分为组合
根据值的数量将以下数组拆分为不同组合的最佳方法是什么Php 根据值的数量将数组拆分为组合,php,arrays,Php,Arrays,根据值的数量将以下数组拆分为不同组合的最佳方法是什么 [0] => 1 [1] => 5 [2] => 4 [3] => 1 [4] => Array ( [0] => 1 [1] => 9 ) To [0] => 1 [1] => 5 [2] => 4 [3] => 1 [4] => 1 AND [0] => 1 [1] => 5 [2] =>
[0] => 1
[1] => 5
[2] => 4
[3] => 1
[4] => Array
(
[0] => 1
[1] => 9
)
To
[0] => 1
[1] => 5
[2] => 4
[3] => 1
[4] => 1
AND
[0] => 1
[1] => 5
[2] => 4
[3] => 1
[4] => 9
函数getCombinations($arr){
$ret=array();
$subs=array();
//提取子数组
$n=计数($arr);
对于($i=0;$i$i,'values'=>$arr[$i],'size'=>count($arr[$i]),'counter'=>0);
$arr[$i]=null;
}
}
$subs\u n=计数($subs);
如果($subs\u n==0)//未找到子数组,则返回输入
返回$arr;
$finished=false;
而(!$finished){
$combination=$arr;//这将复制现有阵列
对于($i=0;$i=$subs[$i]['size']){//如果组合结束,则增加下一级
$carry=true;
$subs[$i]['counter']=0;
}否则{
$carry=false;
}
$i++;
如果($i>=$subs\u n&&$carry){//如果达到最后一个组合,则全部完成
$finished=true;
$carry=false;
}
}
}
返回$ret;
}
我会选择这样的方式:
<?php
$arr = [
0 => 1,
1 => 5,
2 => 4,
3 => 1,
4 => [
0 => 1,
1 => 9,
]
];
$arr = [
0 => null,
1 => $arr,
];
function split_array($a) {
$ended = true;
$new_line = [];
$rem_line = [];
$last_line = array_pop($a);
foreach ($last_line as $k=>$v){
if ( is_array( $v ) ) {
$new_v = array_shift($v);
if ( count($v) > 0 ) {
$rem_v = $v;
$ended = false;
} else {
$rem_v = $new_v;
}
} else {
$new_v = $v;
$rem_v = $v;
}
$new_line[] = $new_v;
$rem_line[] = $rem_v;
}
$a[] = $new_line;
if ( ! $ended ) {
echo 'not ended';
$a[] = $rem_line;
$a = split_array($a);
}
return $a;
}
array_shift($arr);
echo '<pre>';
print_r( split_array($arr) );
echo '</pre>';
到目前为止,您是否尝试编写一些内容?子数组是否在输入数组中出现多次?我尝试了foreach循环的一些内容,但它变得越来越复杂。@Manueloto是的,它们可以。请查看。在发布问题之前,您应该已经研究了您的问题,并尝试自己编写代码。如果您在某个特定的问题上遇到困难,请将您尝试过的内容和相关代码的摘要包含在文档中,以便我们可以帮助您解决问题。
<?php
$arr = [
0 => 1,
1 => 5,
2 => 4,
3 => 1,
4 => [
0 => 1,
1 => 9,
]
];
$arr = [
0 => null,
1 => $arr,
];
function split_array($a) {
$ended = true;
$new_line = [];
$rem_line = [];
$last_line = array_pop($a);
foreach ($last_line as $k=>$v){
if ( is_array( $v ) ) {
$new_v = array_shift($v);
if ( count($v) > 0 ) {
$rem_v = $v;
$ended = false;
} else {
$rem_v = $new_v;
}
} else {
$new_v = $v;
$rem_v = $v;
}
$new_line[] = $new_v;
$rem_line[] = $rem_v;
}
$a[] = $new_line;
if ( ! $ended ) {
echo 'not ended';
$a[] = $rem_line;
$a = split_array($a);
}
return $a;
}
array_shift($arr);
echo '<pre>';
print_r( split_array($arr) );
echo '</pre>';