PHP: удалить из массива с помощью оператора if - PullRequest
8 голосов
/ 13 марта 2019

Я пытаюсь сбросить определенные значения, используя оператор 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 ]

14 голосов
/ 13 марта 2019

Существует множество способов добраться до Рима, как говорится ..

Использование 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); 
11 голосов
/ 13 марта 2019

Потому что после удаления первых 3 элементов значение $i равно 3, но количество массивов равно 2, поэтому для разрывов цикла - помните, что условие цикла переоценивается в каждой итерации .Изменение на это даст вам желаемый результат:

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

Как правило, использование unset с for циклом с индексом int не рекомендуется

4 голосов
/ 13 марта 2019

Я бы порекомендовал вам использовать 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 голосов
/ 13 марта 2019

Я думаю, что проблема $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);

?>
2 голосов
/ 13 марта 2019

Есть много возможных способов сделать это в PHP, так как PHP очень богат массивами и строковыми функциями.

В этом ответе обсуждаются два подхода.

По сути, вы хотите удалить элементы из массива.

Итак, возьмите другой массив с элементами, которые вы хотите удалить.

Узнайте разницу между вашим массивом и новым массивом.

Разница определенно будет вашим ожидаемым результатом.

Вы можете использовать array_diff()

Красота этого подхода:

Вы можете сделать это с минимальными строками кода, также не требуется никаких циклов.

<code>$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];
$remove = ['apple', 'orange', 'melon', 'banana'];
$test = array_diff($fruits, $remove);
echo '<pre>';print_r($test);echo '
';

Выход:

Array
(
    [4] => pineapple
)

Или даже используя array_interset()

Возьмите временный массив с единственными элементами, которые вы хотите сохранить в своем массиве.

Получить массив пересекающихся элементов.

У вас будут удалены все остальные элементы.

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

Выход:

Array
(
    [4] => pineapple
)
1 голос
/ 13 марта 2019

Проблема здесь в счетчике ($ 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);

Надеюсь, это поможет!

0 голосов
/ 12 июня 2019

используйте это:

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