PHP:使用if语句从数组中删除元素

8

我正试图使用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
)

为什么'banana'没有从数组中删除?
7个回答

16

俗话说,“条条大路通罗马”。

使用foreach()

更为简洁的方法是使用foreach循环,利用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); 

2
Kiki,我很高兴你学到了东西!这就是StackOverflow的全部意义——分享知识!dWinder,你的答案解决了具体问题,并解释了为什么当前代码无法工作。我只是展示了不同(也许更有效)的实现方式! - Qirel

11
因为在删除前三个元素后,$i的值为3,但数组的计数是2,所以for循环会中断-请记住每次迭代都会重新评估循环条件。将其更改为以下内容将为您提供所需的输出:
$size = count($fruits)
for ($i = 0 ; $i < $size; $i++){ 

通常不建议在使用整数索引的 for 循环中使用 unset


是的,你可以 @Kiki - MjM
1
在for循环中删除元素并不是问题,但你应该反向循环,从末尾计数到0。for($i=count($fruits); $i >= 0; $i--) ... - Markus Zeller
1
我的方法是创建一个“badwords”数组,然后使用in_array进行检查。这比无尽的if语句更易读。 - Markus Zeller
@MarkusZeller 你的建议都很好 - 我只是想向提问者展示他所犯的错误 - 请随意在我的回答中添加你的建议。 - dWinder
1
@unreleased 我也很惊讶 - 这是我迄今为止最受欢迎的帖子 :) - dWinder
显示剩余2条评论

4

我认为问题出在 $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已经提供了相同的解决方案,并且解释得很好。 - Saad Suri

4

我建议您使用foreach而不是for循环。请尝试下面的代码。

<?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);
?>

2
有很多种方法可以在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_intersect()

创建一个临时数组,其中只包含您想要保留在数组中的元素。

获取数组交集元素。

您将删除所有其他元素。


"Original Answer"翻译成"最初的回答"
$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$two = ['pineapple'];
$test2 = array_intersect($fruits, $two);
echo '<pre>';print_r($test2);echo '</pre>';

输出:

Array
(
    [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 )

1
问题在于这里的 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);

希望这可以帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接