PHP:使用 if 语句从数组中取消设置
Posted
技术标签:
【中文标题】PHP:使用 if 语句从数组中取消设置【英文标题】:PHP: unset from array using if statement 【发布时间】:2019-08-03 18:48:20 【问题描述】:我正在尝试使用 if 语句取消设置特定值。 我的代码是
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
for ($i = 0 ; $i < count($fruits); $i++)
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana')
unset($fruits[$i]);
print_r($fruits);
我期待它回来
Array
(
[4] => pineapple
)
但结果是
Array
(
[3] => banana
[4] => pineapple
)
为什么没有从数组中取消设置“香蕉”?
【问题讨论】:
【参考方案1】:使用这个:
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$fruit_num = count($fruits);
for ($i = 0 ; $i < $fruit_num; $i++)
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana')
unset($fruits[$i]);
print_r($fruits);
而不是:
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
for ($i = 0 ; $i < count($fruits); $i++)
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana')
unset($fruits[$i]);
print_r($fruits);
输出:
Array ( [4] => pineapple )
【讨论】:
【参考方案2】:因为删除前 3 个元素后,$i
的值为 3,但数组的计数为 2,因此 for 循环中断 - 请记住循环条件是在每次迭代中重新评估。改成这个会给你想要的输出:
$size = count($fruits)
for ($i = 0 ; $i < $size; $i++)
一般情况下,不推荐使用unset
和for
带int 索引的循环
【讨论】:
啊,我明白了!太感谢了!我应该使用foreach
而不是未设置吗?
是的,你可以@Kiki
在for循环中删除元素是没有问题的,但是你应该反转循环,所以从末尾数到0。for($i=count($fruits); $i >= 0; $i--) ...
。
我的方法是使用第二个“坏词”数组,然后使用in_array
进行检查。这比无休止的 if 语句更具可读性。
@unreleased 我也很惊讶——我迄今为止获得最高票数的帖子 :)【参考方案3】:
这里的问题是 count($fruits),因为每个循环循环数组都会变小。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$count = count($fruits);
for ($i = 0; $i < $count; $i++)
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana')
unset($fruits[$i]);
print_r($fruits);
希望这会有所帮助!
【讨论】:
【参考方案4】:正如他们所说,去罗马有很多种方式..
使用foreach()
一种更简洁的方法是使用foreach
而不是for
循环,并使用in_array()
来检查数组,而不是单独检查所有水果。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
foreach ($fruits as $key=>$fruit)
if (in_array($fruit, ['apple', 'orange', 'melon', 'banana']))
unset($fruits[$key]);
print_r($fruits);
使用array_filter()
一种更“花哨”的方式是使用array_filter()
的单线,
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$fruits = array_filter($fruits, function($fruit)
return !in_array($fruit, ['apple', 'orange', 'melon', 'banana']);
);
print_r($fruits);
使用array_diff()
更简单的是,使用array_diff()
,它会查找仅存在于一个数组中的所有元素(基本上是删除重复项)。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$remove = ['apple', 'orange', 'melon', 'banana'];
$result = array_diff($fruits, $remove);
使用array_intersect()
还有array_intersect
,它是array_diff()
的倒数。这将找到两个数组中都存在的元素,并将其返回。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$find = ['pineapple'];
$result = array_intersect($fruits, $find);
Live demo using foreach()
Live demo using array_filter()
Live demo using array_diff()
Live demo using array_intersect()
php.net on in_array()
PHP.net on array_diff()
PHP.net on array_filter()
PHP.net on array_intersect()
PHP.net on foreach()
【讨论】:
琪琪,很高兴你学到了一些东西!这就是 *** 的全部意义所在——分享知识! dWinder,您的回答解决了具体问题 - 并解释了为什么当前代码不起作用。我只是展示了不同的(也许更有效的)方法来实现相同的目标!【参考方案5】:我建议您使用foreach
而不是for loop
。试试下面的代码。
<?php
$fruitss = ['apple', 'orange', 'melon', 'banana', 'pineapple','h'];
foreach ($fruitss as $key=>$fruits)
//echo $fruits;
if ($fruits == 'apple' || $fruits == 'orange' || $fruits == 'melon' || $fruits == 'banana')
unset($fruitss[$key]);
print_r($fruitss);
?>
【讨论】:
【参考方案6】:在 PHP 中有许多可能的方法来做到这一点,因为 PHP 具有非常丰富的数组和字符串函数。
在这个答案中,讨论了两种方法。
基本上,您想从数组中删除元素。
因此,使用另一个包含您要删除的元素的数组。
找出你的数组和新数组之间的区别。
差异肯定会是您预期的结果。
您可以使用array_diff()
这种方法的优点是:
你可以用最少的代码行,而且不需要循环。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$remove = ['apple', 'orange', 'melon', 'banana'];
$test = array_diff($fruits, $remove);
echo '<pre>';print_r($test);echo '</pre>';
输出:
Array
(
[4] => pineapple
)
甚至使用array_interset()
获取一个临时数组,其中包含您要在数组中维护的唯一元素。
获取数组相交元素。
您将删除所有其他元素。
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$two = ['pineapple'];
$test2 = array_intersect($fruits, $two);
echo '<pre>';print_r($test2);echo '</pre>';
输出:
Array
(
[4] => pineapple
)
【讨论】:
【参考方案7】:我认为问题是$i<count($fruits)
。它减少了数组大小。所以它只运行了3次。所以首先将数组大小分配给变量。
<?php
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$n=count($fruits);
for ($i = 0 ; $i <$n ; $i++)
if ($fruits[$i] == 'apple' || $fruits[$i] == 'orange' || $fruits[$i] == 'melon' || $fruits[$i] == 'banana')
unset($fruits[$i]);
print_r($fruits);
?>
【讨论】:
纯代码回答不是很有趣。而且我想 dwinder 已经提出了相同的解决方案,并给出了很好的解释。以上是关于PHP:使用 if 语句从数组中取消设置的主要内容,如果未能解决你的问题,请参考以下文章