PHP数组:依次扣除指定值并删除不足元素的实现方法咨询
PHP数组扣除值的实现方案
嘿,这个需求的逻辑其实很好梳理,我给你写两种可行的PHP实现方案,每种都带详细解释,你可以根据自己的习惯选:
方案一:使用索引遍历+array_splice修改数组
这种方式通过索引来控制遍历位置,适合需要灵活控制数组修改位置的场景:
<?php $arr = [20, 40, 30, 50]; $var = 30; $i = 0; while ($var > 0 && $i < count($arr)) { // 检查当前元素是否不足以抵扣剩余值 if ($arr[$i] <= $var) { // 从待扣除值里减去当前元素的数值 $var -= $arr[$i]; // 删除当前元素,array_splice会自动调整数组后续元素的索引 array_splice($arr, $i, 1); // 因为删除了元素,下一个目标元素现在在当前索引位置,所以不用递增$i } else { // 当前元素足够抵扣剩余值,直接扣除 $arr[$i] -= $var; // 待扣除值清零,结束循环逻辑 $var = 0; // 索引递增,继续遍历后续元素 $i++; } } print_r($arr); // 输出结果:Array ( [0] => 30 [1] => 30 [2] => 50 ) ?>
方案一解释:
- 用
$i作为数组的遍历索引,从第一个元素(索引0)开始 - 循环继续的条件是还有待扣除的数值且数组还没遍历完
- 当当前元素小于等于剩余待扣值时,把元素值从
$var中减去,然后删除该元素,此时下一个元素会自动移到当前索引位置,所以不用递增$i - 当当前元素大于剩余待扣值时,直接从元素中扣除剩余的
$var,然后把$var设为0,结束扣除逻辑
方案二:操作数组首元素+array_shift
这种方式更简洁,专注于处理数组的第一个元素,直到待扣值清零:
<?php $arr = [20, 40, 30, 50]; $var = 30; // 只要还有待扣值且数组不为空,就继续处理 while ($var > 0 && !empty($arr)) { // 获取数组的第一个元素 $firstElement = reset($arr); if ($firstElement <= $var) { // 扣除当前元素的全部值 $var -= $firstElement; // 删除数组的第一个元素 array_shift($arr); } else { // 从第一个元素中扣除剩余待扣值 $arr[0] -= $var; // 待扣值清零,停止循环 $var = 0; } } print_r($arr); // 输出结果:Array ( [0] => 30 [1] => 30 [2] => 50 ) ?>
方案二解释:
- 用
reset()快速获取数组的第一个元素,array_shift()直接删除第一个元素,不用关心索引变化 - 循环逻辑和方案一核心一致:不够扣就删元素、继续扣剩余值;够扣就直接扣除剩余值、结束流程
- 这种写法代码更短,逻辑更直观,适合只需要从数组开头依次处理的场景
两种方案都能得到你想要的结果(30,30,50),你可以根据自己的代码习惯选择使用~
内容的提问来源于stack exchange,提问作者rahul
相关产品推荐
相关产品推荐

