Php 如何减去数组的值,但仍处于位置

Php 如何减去数组的值,但仍处于位置,php,arrays,Php,Arrays,如果数组的值大于特定数据,如何减去该值 例如: 我有一个菜单位置的数组[0,3,10,5,6,9,2,7,1,4,8,11]我想减去所有大于所选删除数字的值,并保持它们的位置 示例:如果我删除3和5。我正在使用复选框删除 输出应该是这样的 [0,8,4,7,2,5,1,3,6,9] 由于我选择了2数字,大于3的值将被1减去,大于5的值将被2减去 HTML 提前感谢。对于($i=0;$i$item)在算术中使用时,将被评估为true或false,true=1和false=0 基于语言构造的方法:

如果数组的值大于特定数据,如何减去该值

例如:

我有一个菜单位置的数组
[0,3,10,5,6,9,2,7,1,4,8,11]
我想减去所有大于
所选删除数字的值,并保持它们的位置

示例:如果我删除
3
5
。我正在使用复选框删除

输出应该是这样的

[0,8,4,7,2,5,1,3,6,9]

由于我选择了
2
数字,大于
3
的值将被
1
减去,大于
5
的值将被
2
减去

HTML

提前感谢。

对于($i=0;$ifor ($i = 0; $i < count($menuPositions); $i++) {
        for ($j = 0; $j < count($selectedDeletedNumbers); $j++) {
            if ($menuPositions[$i] == $selectedDeletedNumbers[$j]) {
                unset($menuPositions[$i]); // remove the match value from array
                $menuPositions = array_values($menuPositions); // reorganize array keeping only the values are not null
                $i--; //include the new value of $menuPositions[$i] on interation
                break;
            }
            if ($menuPositions[$i] > $selectedDeletedNumbers[$j] ) {
                $menuPositions[$i]--;
            }
        }
    }
对于($j=0;$j$selectedDeletedNumbers[$j]){ $menuPositions[$i]--; } } }
为了清晰和简洁,我将您的输入数据称为:

$array = [0, 3, 10, 5, 6, 9, 2, 7, 1, 4, 8, 11];
$deletes = [3, 5];
我的两个代码片段都不需要排序或准备

以下两项的输出为:

array (
  0 => 0,
  1 => 8,
  2 => 4,
  3 => 7,
  4 => 2,
  5 => 5,
  6 => 1,
  7 => 3,
  8 => 6,
  9 => 9,
)
主要基于功能的方法:()

*注:
($value>$item)
在算术中使用时,将被评估为
true
false
true
=
1
false
=
0


基于语言构造的方法:()


这段代码的优点是,没有函数调用,声明的变量最少。

另外一个解决方案是优化对要删除内容的检查。此代码确保删除列表是基于0的数组,因此在示例中,它确保

[ 0 => 3, 1 => 5 ]
然后按降序排序,但保留键,所以

[ 1 => 5, 0 => 3 ]
然后,当检查数字时,如果数字大于5,它会减去键+1,因此1+1=2(对不起,这是基础数学)。然后它就可以停止,不需要再检查了

$menu = [0,3,10,5,6,9,2,7,1,4,8,11];
$selectedDeletedNumbers = [3,5];
// In case array is not just 0 based index, can remove if it will be
$selectedDeletedNumbers = array_values($selectedDeletedNumbers);
// Sort so highest first, keep key (this is the offset)
arsort($selectedDeletedNumbers);

foreach ( $menu as $key => $menuItem )  {
    foreach ( $selectedDeletedNumbers as $deleteIndex => $delete )  {
        // Matching, just remove and carry on
        if ( $menuItem == $delete ) {
            unset($menu[$key]);
            break;
        }
        // Greater than item, so deduct index and move on
        if ( $menuItem > $delete )  {
            $menu[$key] -= ($deleteIndex+1);
            break;
        }
    }
}

print_r($menu);
如果所选阵列可能以任意顺序出现,则可以替换

$selectedDeletedNumbers = array_values($selectedDeletedNumbers);
符合

sort($selectedDeletedNumbers);

要从数组中删除数字并从原始数组中的当前数字中减去小于
selectedDeletedNumbers
中数字数的计数,您可以:

  • selectedDeletedNumbers
    数组进行排序
  • 在原始数组上迭代并使用以获得小于原始数组中当前数字的数字计数,然后将其减去
  • 如果当前号码出现在所选的删除号码中,则将其取消设置
片段:

<?php


$arr = [0,3,10,5,6,9,2,7,1,4,8,11];

$selectedDeletedNumbers = [3,5];

sort($selectedDeletedNumbers);

foreach($arr as $index => $val){
    $low = 0;$high = count($selectedDeletedNumbers) - 1;
    $equal_found = false;
    while($low <= $high){
        $mid = intval(($low + $high) / 2);
        if($selectedDeletedNumbers[$mid] > $val){
            $high = $mid - 1;
        }else if($selectedDeletedNumbers[$mid] < $val){
            $low = $mid + 1;
        }else{
            $equal_found = true;
            unset($arr[$index]);
            break;
        }
    }

    if(!$equal_found){
        $arr[$index] -= $low;
    }
}

print_r($arr);

哎呀,抱歉忘了指出。前面的数字仍然相同,
0,1,2
仍然相同。由于我选择了2个数字,因此大于5的数字将被2减去。这是不明确的。让我们以10为例。10等于8,因为10大于3和5。“我说得对吗?”维韦克说,我会重新解释这个问题。存在从0到11的整数集合。用户将决定从数组中删除一个或多个数字。然后,列表中的数字必须全部“下移”,以便最低的数字为
0
,并且输出数组中没有间隙。。。所有这些,同时保持未删除整数的原始顺序。换句话说,这大约是1。然后删除2。间隙消除。@mickmackusa我遇到了一个小问题,我的复选框的值是
0:“home,1”1:“about,2”
。您能帮我获取
[1,2]
的数值吗。Thanks@viv听起来很准确。从当前迭代值中减去{删除数组中小于当前迭代值的元素数}。如果删除数组中指定了当前元素的原始值,请确保删除当前元素。它是输入数组。在示例中:[0,3,10,5,6,9,2,7,1,4,8,11]@mickmackusa视情况而定,如果选定的删除数组来自复选框列表,我会假设(可能这是错误的)它们将以数字顺序出现。因此,如果它们是0,11,它就可以工作。@mickmackusa,如果您最终得到
[1=>3,4=>5]
,那么情况就更糟了,但是如果您将其更改为更新,那么它应该可以工作-谢谢您的帮助;)我将您的旧代码与\u array中的
一起使用
它工作得非常好。谢谢你救了我一天。Cheers@Marky您现在有权投票选出有用的答案。我希望你会考虑所有你觉得有用/正确的答案。你今天在这里收到了一些非常好的答案。你好,再次@mickmackusa,我再次需要帮助。当我的数据数组像这样时,我遇到了一个问题$array=[[0,3,10,5,6,9,2,7,1,4,8,11],[0,1],[0,1],[0,1];。得到错误的结果。@Marky看起来是一个完全不同的问题,我不知道您希望从这个新的输入结构中看到什么输出。您希望看到这个吗<代码>[4,0,3,1,2,5]
?这是我回答的一个不优雅的延伸:我今晚有工作要做,所以我不能玩。
$menu = [0,3,10,5,6,9,2,7,1,4,8,11];
$selectedDeletedNumbers = [3,5];
// In case array is not just 0 based index, can remove if it will be
$selectedDeletedNumbers = array_values($selectedDeletedNumbers);
// Sort so highest first, keep key (this is the offset)
arsort($selectedDeletedNumbers);

foreach ( $menu as $key => $menuItem )  {
    foreach ( $selectedDeletedNumbers as $deleteIndex => $delete )  {
        // Matching, just remove and carry on
        if ( $menuItem == $delete ) {
            unset($menu[$key]);
            break;
        }
        // Greater than item, so deduct index and move on
        if ( $menuItem > $delete )  {
            $menu[$key] -= ($deleteIndex+1);
            break;
        }
    }
}

print_r($menu);
$selectedDeletedNumbers = array_values($selectedDeletedNumbers);
sort($selectedDeletedNumbers);
<?php


$arr = [0,3,10,5,6,9,2,7,1,4,8,11];

$selectedDeletedNumbers = [3,5];

sort($selectedDeletedNumbers);

foreach($arr as $index => $val){
    $low = 0;$high = count($selectedDeletedNumbers) - 1;
    $equal_found = false;
    while($low <= $high){
        $mid = intval(($low + $high) / 2);
        if($selectedDeletedNumbers[$mid] > $val){
            $high = $mid - 1;
        }else if($selectedDeletedNumbers[$mid] < $val){
            $low = $mid + 1;
        }else{
            $equal_found = true;
            unset($arr[$index]);
            break;
        }
    }

    if(!$equal_found){
        $arr[$index] -= $low;
    }
}

print_r($arr);