PHP:使用if语句从数组取消设置

时间:2019-03-13 06:54:01

标签: php arrays unset

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

为什么数组中未设置“香蕉”?

7 个答案:

答案 0 :(得分:13)

正如他们所说,有很多通往罗马的方式。

使用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); 

答案 1 :(得分:11)

由于删除了前3个元素后,$i的值为3,但数组的计数为2,所以for循环中断-请记住循环条件在每次迭代中重新评估 >。更改为此将为您提供期望的输出:

$size = count($fruits)
for ($i = 0 ; $i < $size; $i++){ 

通常,不建议将unsetfor循环一起使用int索引

答案 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);

?>

答案 3 :(得分:4)

我建议您使用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);
?>

答案 4 :(得分: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_interset()

使用仅要在数组中维护的元素构成一个临时数组。

获取数组相交元素。

您将删除所有其他元素。

$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$two = ['pineapple'];
$test2 = array_intersect($fruits, $two);
echo '<pre>';print_r($test2);echo '</pre>';

输出:

Array
(
    [4] => pineapple
)

答案 5 :(得分: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);

希望这会有所帮助!

答案 6 :(得分:0)

使用此:

$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 )