Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除数组中1后面的零_Php_Arrays_Loops - Fatal编程技术网

Php 删除数组中1后面的零

Php 删除数组中1后面的零,php,arrays,loops,Php,Arrays,Loops,我正在获取一组复选框(动态创建)的值。有几个问题,但我把范围缩小到某一点。现在问题的抽象是这样的(暂时忘记这些是复选框,想象一下我们正在处理一个数字数组) 我有一个数组存储[20],其中包含0或1的值。 我需要去掉1后面的每一个0。 让我们假设我的数组是store={0,1,0,1,0,0}。 我需要创建一个新数组,如下所示check={0,1,1,0}。 第三项和第五项不必插入到新数组中,因为它们紧跟在第二项和第四项之后(这是一项) 此外,如果您想知道,没有连续两次出现,因此无需担心 这是我的

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

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

此外,如果您想知道,没有连续两次出现,因此无需担心

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

$j=0$计数=0;

对于($j=0;$j这是我从运行代码中获得的输出:

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;                
    }
}

在PHP中,您可以只使用
str_split
、一个小正则表达式和一个
内爆
,而不必担心for循环。添加
数组映射
,结果将以整数而不是字符串的形式返回

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


根据我的理解,您只需要前面的元素来决定结果中是否包含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);

数组末尾的空值不是问题,我以后也不会读取它们,所以请不要介意。它(碰巧)对上述输入有效。它对某些输入有效,而对其他输入无效。例如,请尝试$store=array(1,0,0,1,0,1,1,0);事实上,我喜欢您优雅的解决方案,但在这种情况下,数据类型有点大(正如我在问题的开头提到的,这只是真实问题的抽象。如果不是整数结果,我甚至无法测试解决方案)但是我会看看我是否能转换结果,让所有人都知道上面的解决方案工作得很好,而且转换非常容易。为此,请检查这个线程,接受的答案是在数据类型之间转换的最佳方式。@amygrimaldi我将转换添加到了答案中。我已经检查过自己想出了相同的方法(不能指望别人帮我做所有的工作。)不管怎样,非常感谢。
$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);
?>
<?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,
)