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