Удалите каждый 3-й и 4-й элемент из массива в php

#php #arrays

#php #массивы

Вопрос:

У меня есть приведенный ниже массив, я хочу пропустить первые 3 элемента из массива (ключ — 0, 1, 2) и удалить следующие 2 элемента (ключ — 3, 4). т. Е. Я хочу, чтобы массив был таким, он пропускал каждый 1-й элемент 3 и удалял следующие 2 элемента после первых 3. Я пробовал приведенный ниже код, но это неподходящее решение для этого.

 for($i = 0; $i < count($newArray); $i  = 1) {
    if($i == 3 || $i == 4 || $i == 8 || $i == 9){
        unset($newArray[$i]);
    }
}
  

Входной массив

 Array
    (
        [0] => 0.393
        [1] => 0.769
        [2] => 0.189
        [3] => 0
        [4] => 0
        [5] => 0.349
        [6] => 0.686
        [7] => 0.168
        [8] => 0
        [9] => 0
        [10] => 0.272
        [11] => 0.534
        [12] => 0.131
        [13] => 1
        [14] => 0
    )

**Expected Output**

    Array
            (
                [0] => 0.393
                [1] => 0.769
                [2] => 0.189
                [3] => 0.349
                [4] => 0.686
                [5] => 0.168
                [6] => 0.272
                [7] => 0.534
                [8] => 0.131
            )
  

Комментарии:

1. вы хотите удалить только integers и сохранить float значения?

2. Нет, я хочу удалить пропустить 1-й элемент 3 из, а затем отменить следующие 2, снова пропустить 3 и отменить следующие 2 вот так

Ответ №1:

Вы можете использовать array_filter , используя ARRAY_FILTER_USE_KEY флаг для передачи ключей элементов в функцию фильтра и удаления всех записей, key % 5 не < 3 :

 $newArray = array_filter($newArray, function ($k) { return $k % 5 < 3; }, ARRAY_FILTER_USE_KEY );
print_r($newArray);
  

Вывод:

 Array
(
    [0] => 0.393
    [1] => 0.769
    [2] => 0.189
    [5] => 0.349
    [6] => 0.686
    [7] => 0.168
    [10] => 0.272
    [11] => 0.534
    [12] => 0.131
)
  

Обратите внимание, что если вы хотите, чтобы значения массива были проиндексированы с 0, вы можете передать результат через array_values :

 $newArray = array_values($newArray);
print_r($newArray);
  

Вывод:

 Array
(
    [0] => 0.393
    [1] => 0.769
    [2] => 0.189
    [3] => 0.349
    [4] => 0.686
    [5] => 0.168
    [6] => 0.272
    [7] => 0.534
    [8] => 0.131
)
  

Демонстрация на 3v4l.org

Комментарии:

1. У меня это работает. Можем ли мы сделать это без фильтра массива? Также можете ли вы объяснить решение, которое вы дали, чтобы оно было полезным.

2. @user8989878 array_filter возвращает элементы массива, для которых функция возвращает true . Передавая ключ массива функции и принимая его по модулю 5, первые 3 ключа равны 0-2, следующие два 3-4, следующие три снова 0-2, следующие два 3-4 и т.д. и т.п. Поэтому, если мы вернем true, когда значение ключа равно 0, 1 или 2, мы вернем значения по вашему желанию.

3. Вы могли бы создать решение, используя простой цикл foreach, например 3v4l.org/i3IIr