删除数组中 1 之后的零

Remove zeros that follow a 1 in an array

我正在获取复选框数组(动态创建)的值。有几个问题,但我将其缩小到某一点。现在问题的摘要是这样的(暂时忘记这些是复选框,想象一下我们正在处理一个数字数组)。

我有一个数组 store[20],其中包含值 0 或 1。 我需要去掉 1 后面的每一个 0。 前任。假设我的数组是 store={0, 1, 0, 1, 0, 0}。 我需要创建一个像这样的新数组 check={0, 1, 1, 0}。 第三项和第五项不必插入新数组中,因为它们跟在第二项和第四项(它们是一)之后。

另外,如果你想知道,没有出现两个连续的,所以不用担心。

这是我的 php 代码(但其他语言的实现是相同的,因为它只是 for 循环和数组):

$j=0;   $count=0;
    for($j=0;$j<20; $j++) {
        $check[$j] = $store[$j + $count];
        if($store[$j]) {
            $count = $count + 1;                
        }
    }

代码运行不正常。也许我在实施它的方式上完全错了。但我有点累了,开始看东西了。我真的看不出我做错了什么。

PS:我没有包括数组声明和其他前面的代码,因为我已经测试过了,我知道它们没问题。问题出在这部分代码的逻辑上。

这是我从 运行 你的代码得到的输出:

Array
(
    [0] => 0
    [1] => 1
    [2] => 1
    [3] => 0
    [4] =>
    [5] =>
    [6] =>
    [7] =>
    [8] =>
    [9] =>
    [10] =>
    [11] =>
    [12] =>
    [13] =>
    [14] =>
    [15] =>
    [16] =>
    [17] =>
    [18] =>
    [19] =>
)

所以基本上它是有效的,除了数组末尾存在空值,因为您正在读取 $store 数组边界之外的值。只需检查您是否在 for 循环中的数组边界之外。请注意,我在操作中添加了 +$count

$store = array(0, 1, 0, 1, 0, 0);
$j=0;
$count=0;
$check = array();

for($j=0;$j+$count<count($store); $j++) {
    $check[] = $store[$j + $count];
    if($store[$j+$count]) {
        $count = $count + 1;                
    }
}

输出:

Array
(
    [0] => 0
    [1] => 1
    [2] => 1
    [3] => 0
)

在 PHP 中,您可以只使用 str_split、一点正则表达式和 implode,而不必担心 for 循环。添加 array_map,结果将作为整数而不是字符串返回。

$check = array_map('intval',str_split('',preg_replace('/01/','',implode('',$store))));

演示:

<?php
    $store = array(0, 1, 0, 1, 0, 0);
    $check = str_split(preg_replace('/10/','1',implode('',$store)));
    var_dump($check);
    $check = array_map('intval',$check)
    var_dump($check);
?>

根据我的理解,你只需要前面的元素来决定结果中是否包含 0:

<?php
$store=[0, 1, 0, 1, 0, 0];

$prev=0; $result = array();
foreach($store as $e) {
    if ( $e || !$prev ) {
        $result[] = $e;
    }
    $prev = $e;
}

var_export($result);

...很可能有更优雅的解决方案,但这个解决方案打印

array (
  0 => 0,
  1 => 1,
  2 => 1,
  3 => 0,
)