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

一般情况下,不推荐使用unsetfor 带int 索引的循环

【讨论】:

啊,我明白了!太感谢了!我应该使用foreach 而不是未设置吗? 是的,你可以@Kiki 在for循环中删除元素是没有问题的,但是你应该反转循环,所以从末尾数到0。for($i=count($fruits); $i &gt;= 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&lt;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 语句从数组中取消设置的主要内容,如果未能解决你的问题,请参考以下文章

PHP - IF 语句在 While 循环中始终为真

使用 php echo 语句构建 JSON

从 SQL 表获取的数组中的单个 IF 语句与多个 IF 语句 [关闭]

从数组 IF 取消设置元素

PHP - 在foreach循环中取消设置数组元素[重复]

如何使用带有 If 语句的数组