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