Я пытаюсь remove all the element of PHP array, если the value equals zero

Я стараюсь изо всех сил и читаю the unset document, но все еще застреваю на достигнутом

Мой HTML page. У меня 9 input type = number с name = count[]

<form action="send.php" method="post">
    <div>
        <input type="number" name="count[]" id="count-1" value="0" min="0" max="99">
    </div>
    <div>
        <input type="number" name="count[]" id="count-2" value="0" min="0" max="99">
    </div>
    <div>
        <input type="number" name="count[]" id="count-3" value="0" min="0" max="99">
    </div>
    ...
    <div>
        <input type="number" name="count[]" id="count-9" value="0" min="0" max="99">
    </div>
    <div>
        <input type="submit" value="submit" name="submit">
    </div>
</form>

А это мой файл send.php

Я имею в виду, что если элемент $count равен zero, я remove выберу этот элемент из массива. Но похоже, что что-то было не так.

<?php
if (isset($_POST)) {
    $count = $_POST["count"];
    for ($i = 0; $i < count($count); $i++) {
        if (0 == (int) $count[$i])
            unset($count[$i]);
    }
}

Это мой POST data

Array
(
    [count] => Array
        (
            [0] => 1
            [1] => 1
            [2] => 1
            [3] => 0
            [4] => 0
            [5] => 0
            [6] => 0
            [7] => 0
            [8] => 0
        )

    [submit] => submit
)

И это данные $count array, которые я привел. Я не знаю, почему if statement не работает с некоторыми из последних элементов.

Array
(
    [0] => 1
    [1] => 1
    [2] => 1
    [6] => 0
    [7] => 0
    [8] => 0
)

Я использую PHP 8

Спасибо!

php
0
NguyenVan 27 Ноя 2021 в 14:24

2 ответа

Лучший ответ

Вместо того, чтобы перебирать массив и проверять каждое значение, вы можете использовать array_filter для удаления нулей. По умолчанию array_filter удаляет пустые значения, одним из которых является 0 и '0' в PHP. Вот рабочая демонстрация использования array_filter.

$count = array_filter($_POST["count"]);

Ваша текущая реализация не будет работать, потому что вы используете count внутри оператора for. Поскольку вы unset - вводите значения массива, счет будет меньше для следующего итератора цикла.

Вот такой простой пример; первая итерация count - 7. После двух итераций мы сбрасываем значение из массива. На следующей итерации count вернет 6. С каждым unset вы уменьшаете значение, возвращаемое count, в то время как увеличиваете $i. Исправление для этого - сохранить начальное значение count перед циклом, чтобы оно было фиксированным значением во время цикла. Вот рабочая демонстрация или что-то подобное.

$numOfCounts = count($count);

for ($i = 0; $i < $numOfCounts; $i++) {
    if (0 == (int) $count[$i])
        unset($count[$i]);
}
2
Kim Hallberg 27 Ноя 2021 в 14:44
Это работает, сэр. И знаете ли вы, почему все мои приведенные выше коды не работают?
 – 
NguyenVan
27 Ноя 2021 в 14:42
1
Просто отредактировал свой ответ и добавил объяснение по этому поводу. 👍
 – 
Kim Hallberg
27 Ноя 2021 в 14:45
О, я понял...
 – 
NguyenVan
27 Ноя 2021 в 14:51

Просто используя функцию фильтра php (https://www.php.net/manual/en/function .array-filter.php) [фильтр]

$count = [];
if (isset($_POST["count"])
   $count = array_filter(function($a){ return $a !== 0; }, $_POST["count"]);

print_r($count);
0
Pascal Tovohery 27 Ноя 2021 в 14:31
«Вместо этого сделай так» не отвечает на вопрос, почему это не работает с кодом в вопросе - пожалуйста, ответьте и на этот вопрос. Обратите внимание, что решение можно значительно упростить, поскольку в функции нет необходимости, поскольку это всего лишь правдивая проверка (также предоставленная функция не будет работать, поскольку значения являются строками, а не целыми числами).
 – 
AD7six
27 Ноя 2021 в 14:31