PHP не установлен Не работает должным образом

Я просто пытаюсь удалить все объекты Array, для которых 'visible' установлен в '0'

Массив:

{
"Count":5,
"0":{"id":"1","visible":"0"},
"1":{"id":"3","visible":"0"},
"2":{"id":"1","visible":"0"},
"3":{"id":"2","visible":"0"},
"4":{"id":"3","visible":"0"}
}

PHP:

function cleanup($arr) {
    for($i = 0; $i < (count($arr)-1); $i++) {
        if($arr[$i]['visible'] == false) {
            unset($arr[$i]);
        }
    }
    $newarr = array_unique($arr, SORT_REGULAR);
    $newarr['Count'] = count($newarr)-1;

    return $newarr;
}

Результат:

{
"Count":2,
"3":{"id":"2","visible":"0"},
"4":{"id":"3","visible":"0"}
}

На мой взгляд, это должно сработать и вернуть {"Count":0}. Также Почему "ключи" не были установлены на 0,1 вместо 3,4. Куда я иду не так?

2 ответа

Решение

Вы используете count($arr)-1) внутри цикла for, и он переоценивается на каждой итерации, поэтому после того, как вы сбросили первые три раза, i равно 3, а count($arr)-1) равно 1, и вы выходите из цикла. Вы должны установить $j=count($arr)-1 перед циклом for и использовать для ($i = 0; $i <$ j; $ i ++)

В целом, это плохая практика программирования (с точки зрения производительности) - использовать такие функции, как count () внутри цикла for.

unset() не будет переупорядочивать индексы массива, если вы удаляете индекс из середины числового массива. Вам нужно переиндексировать массив самостоятельно. array_values() здесь полезно

function cleanup($arr) {
    for($i = 0; $i < (count($arr)-1); $i++) {
        if($arr[$i]['visible'] == false) {
            unset($arr[$i]);
        }
    }
    $newarr = array_values(array_unique($arr, SORT_REGULAR));
    return $newarr;
}

Count собственность для меня не имеет смысла, поэтому я ее отбросил. Вы можете использовать функцию count() вместо.

Другие вопросы по тегам