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

Kik*_*iki 8 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);
Run Code Online (Sandbox Code Playgroud)

我希望它能回来

Array
(
  [4] => pineapple
)
Run Code Online (Sandbox Code Playgroud)

但是结果是

Array
(
  [3] => banana
  [4] => pineapple
)
Run Code Online (Sandbox Code Playgroud)

为什么不从阵列中设置“香蕉”?

Qir*_*rel 14

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

使用 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);
Run Code Online (Sandbox Code Playgroud)

使用 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);
Run Code Online (Sandbox Code Playgroud)

使用 array_diff()

甚至更简单地使用use array_diff(),它查找仅存在于一个数组中的所有元素(本质上删除重复项)。

$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$remove = ['apple', 'orange', 'melon', 'banana'];
$result = array_diff($fruits, $remove);
Run Code Online (Sandbox Code Playgroud)

使用 array_intersect()

还有array_intersect,是的倒数array_diff()。这将找到两个数组中都存在的元素,并将其返回。

$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$find = ['pineapple'];
$result = array_intersect($fruits, $find); 
Run Code Online (Sandbox Code Playgroud)

  • 琪琪,很高兴你学到了一些东西!这就是StackOverflow的全部意义-共享知识!dWinder,您的答案解决了特定问题-并解释了为什么当前代码无法正常工作。我只是展示了实现同一件事的不同(也许更有效)的方法! (2认同)

dWi*_*der 11

因为除去第一个3元素后,$i值是3,但是数组的计数是2,所以for循环中断-请记住,循环条件在每次迭代中都会重新计算。更改为此将为您提供期望的输出:

$size = count($fruits)
for ($i = 0 ; $i < $size; $i++){ 
Run Code Online (Sandbox Code Playgroud)

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