PHP递增数组1

问题描述 投票:0回答:2

例如,我有一个简单的数组$iteration=[0,1,2,3,4],并且我试图构建一个函数以将其递增到$max=12的最大值,但是我无法将相同的数字重复使用于2个键。但是到目前为止,我几乎没有成功。这是我现在所拥有的。

//$iteration is my array and $max is the maximum value a key can have.
IncrementIteration($iteration,$max){
    $count=count($iteration);
    while($count > 0){
        if( ($iteration[($count-1)] < $max) ){
            $iteration[($count-1)]++;
            break;
        }
        $count--;
    }
    return $iteration;
}

但是,从不重置递增键之后的键,并且如果已经使用过该数字,则不会考虑。

这里是我要寻找的结果示例:

print_r(IncrementIteration([0,1,2],12))

Output:数组([0] => 0 [1] => 1 [2] => 3]

print_r(IncrementIteration([0,1,12],12))

Output:数组([0] => 1 [1] => 2 [2] => 3]

print_r(IncrementIteration([0,11,12],12))

Output:数组([0] => 1 [1] => 2 [2] => 3]

这将是最高的增量。

print_r(IncrementIteration([10,11,12],12))

Output:数组([0] => 10 [1] => 11 [2] => 12]

感谢您对此代码的任何帮助。


我正在添加其他功能,以使该功能的目的更加清楚。

function ReverseSUM($value,$array){
    global $debug;
    $count=count($array);
    $count=3;
    $values=array();
    while($count > 0){
        //Init of While Iteration
        $iteration=GenerateIteration($count);
        //We iterate
        while(SumIteration($iteration,$array) != $value){
            if($iteration === IncrementIteration($iteration,(count($array)-1))){
                break;
            } else {
                $iteration=IncrementIteration($iteration,(count($array)-1));
            }
            //End of While Iteration
        }
        //End of While Iteration
        if(SumIteration($iteration,$array) == $value){
            array_push($values,$iteration);
        }
        unset($iteration);
        if($debug){echo "</div>";};
        $count--;
    }
    return $values;
}
function GenerateIteration($number){
    $iteration=array();
    $count = 0;
    while($count < $number){
        array_push($iteration,$count);
        $count++;
    }
    return $iteration;
}
function IncrementIteration($iteration,$max){
    $count=count($iteration);
    while($count > 0){
        if( ($iteration[($count-1)] < $max) ){
            $iteration[($count-1)]++;
            break;
        }
        $count--;
    }
    return $iteration;
}
function SumIteration($iteration,$array){
    $result=array();
    foreach($iteration as $key){
        array_push($result,$array[$key]);
    }
    return array_sum($result);
}
php arrays increment
2个回答
0
投票

可能有些类似的东西可以帮助您,

  function unique_keys_array($array) {
    $temp_array = array();
    $i = 0;
    $key_array = array();

    foreach($array as $key) {
        if (!in_array($key, $key_array)) {
            $key_array[$i] = $key;
            $temp_array[$i] = $key;
        }
        $i++;
    }
    return $temp_array;
}


print_r(unique_keys_array([1,2,2,3,4,5,6,7,8,8,9,9]));

returns Array
(
    [0] => 1
    [1] => 2
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 6
    [7] => 7
    [8] => 8
    [10] => 9
)

0
投票

这是我的反向求和的最终代码

function ReverseSUM($value,$array){
    ini_set('max_execution_time', 10);
    if (!function_exists('GenerateIteration')) {
        function GenerateIteration($number){
            global $debug;
            $iteration=array();
            $count = 0;
            while($count < $number){
                $count++;
                array_push($iteration,$count);
            }
            return $iteration;
        }
    }
    if (!function_exists('IncrementIteration')) {
        function IncrementIteration($iteration,$max){
            global $debug;
            $count=count($iteration);
            while($count > 0){
                if( $iteration[($count-1)] < $max ){
                    $iteration[($count-1)]++;
                    if($count != count($iteration)){
                        $count2=$count;
                        while($count2 <= count($iteration)){
                            if($count2 != count($iteration)){
                                // if( ($iteration[$count2] < $max) ){
                                    $iteration[$count2]=($iteration[($count2-1)]+1);
                                // }
                            }
                            $count2++;
                        }
                    }
                    break;
                }
                $max--;
                $count--;
            }
            return $iteration;
        }
    }
    if (!function_exists('SumIteration')) {
        function SumIteration($iteration,$array){
            global $debug;
            $result=array();
            foreach($iteration as $key){
                array_push($result,$array[$key]);
            }
            return array_sum($result);
        }
    }
    $count=count($array);
    $count=3;
    $values=array();
    while($count > 0){
        //Init of While Iteration
        $iteration=GenerateIteration($count);
        //We iterate
        while(SumIteration($iteration,$array) != $value){
            if($iteration === IncrementIteration($iteration,(count($array)-1))){
                break;
            } else {
                $iteration=IncrementIteration($iteration,(count($array)-1));
            }
            //End of While Iteration
        }
        //End of While Iteration
        if(SumIteration($iteration,$array) == $value){
            array_push($values,$iteration);
        }
        unset($iteration);
        $count--;
    }
    return $values;
}

这是我如何显示结果:

<?php foreach($recap as $line => $value){ ?>
    <?php if($line<2){?>
    <table border="1">
        <tr>
            <th colspan="2" style="text-align:left;">Line <?=$line?> - <?=$value?></th>
        </tr>
        <tr>
            <th>Iteration</th>
            <th>Values</th>
        </tr>
        <?php foreach(ReverseSUM($value,$invoice) as $iteration => $values){?>
            <tr>
                <td><?=$iteration?></td>
                <td>
                    <?php foreach($values as $array){?>
                        <?=($array +1)?><br />
                    <?php } ?>
                </td>
            </tr>
        <?php } ?>
    </table>
    <?php } ?>
<?php } ?>

$ recap数组仅包含我们要搜索的总值。 $ invoice数组包含所有发票行总计。

在GitHub上可用的代码:https://github.com/LouisOuellet/ReverseSUM

纯粹

© www.soinside.com 2019 - 2024. All rights reserved.