php数组键与元素之和的组合

时间:2017-08-29 05:38:24

标签: php arrays

.test button:first-child or .test button:nth-child(1)

.test button:nth-child(2)
.test button:nth-child(3)

.test button:last-child or  .test button:nth-child(4) 

类似于给定数组的所有可能组合 接下来像2_7_8(关键)等...... 基本上是给定数组元素的组合......

2 个答案:

答案 0 :(得分:1)

不要认为有办法绕过它......你需要将密钥分开_并将所有[sf_$k[$i]]加在$k所在的位置拆分键和$i大于0(这样就不会试图获得sf_sf

答案 1 :(得分:1)

基本上......你将基础数组$base添加到结果数组$result,直到没有任何变化

$base = array( 2 => 1, 7 => 1, 8 => 1, 9 => 2 );
$results = $base;
$changed = true;
while($changed) {
    $changed = false;
    foreach($results as $id => $sum) {
        // which elements are included already?
        $contained = explode('_', $id);        
        foreach($base as $num => $value) {
            if(!in_array((string)$num, $contained)) {  
                // if current is not included, add
                $newid = array_merge($contained, [$num]);
                sort($newid); // optional, unless name must be sorted
                if(!isset($results[implode('_', $newid)])) {
                    // only add, if we don't already know that new element.
                    $results[implode('_', $newid)] = $sum + $value;
                    // set changed to true, so that another pass is made
                    $changed = true;
                }
            }
        }
    }
}

这绝对不是最好或最有效的方法,但它很简单且有效。

如果无需对密钥进行排序,$results[$id.'_'.$num] = $sum + $value就足够了,而不是$newid创建,排序和内爆。

<强>更新

如果您的基本数组包含n个元素,则结果中包含2个n元素的幂。如果n足够大,我的天真实施将需要一些时间。

在这种情况下,更好的解决方案是:

$base = array( 2 => 1, 7 => 1, 8 => 1, 9 => 2 );
$sums = array();
$names = array();
$max = pow(2,count($base));
for($n=1; $n<$max; $n++)  {
    $sums[$n] = 0;
    $names[$n] = '';
    foreach(array_keys($base) as $index => $number) {
         $sums[$n] += ($n & pow(2,$index)) ? $base[$number] : 0;
         $names[$n] .= ($n & pow(2,$index)) ? '_'.$number : '';
    }
    $names[$n] = substr($names[$n], 1);
}
$result = array_combine($names, $sums);