2015-12-17 7 views
3

Этот код работает так, как ожидалось, и удаляет элемент массива, когда значение имеет значение 5 или 10. Но оно работает только тогда, когда у меня есть 1 значение, равное 5 или 10 в массиве ,array_splice() не работает должным образом внутри цикла

Если у меня есть более 1 значения, которое равно 5 или 10, оно удаляет только 1 из них и оставляет другие элементы в массиве.

Мой код:

for($i = 0; $i <= 10; $i++) { 
    if($somevar[$i] == 5 || $somevar[$i] == 10) { 
     echo 'the sumvar'.$somevar[$i].' exists<br>'; 
     array_splice($somevar, $i, 1); 
    } 
} 

В качестве примера, если у меня есть: [3, 5, 4] результат, как и ожидалось: [3, 4]. Но если у меня есть массив вроде: [3, 5, 10, 4], он просто удаляет 5, но не 10: [3, 10, 4].

Я не могу найти, что я делаю неправильно, и почему мой код работает не так, как ожидалось?

+0

Если вы используете 'array_splice()', как это будет удалить элемент массива и переиндексирован массив. Поэтому, если вы удалите 5 с помощью ключа 0, вы перейдете к 1 с помощью своего цикла, но массив будет переиндексирован на: '[0 => 10, 1 => 6]', и вы пропустите 10, потому что вы не идете назад к 0. Так что просто используйте 'unset()' и переиндексируйте массив после него с помощью 'array_values ​​()'. Также, если вы просто хотите отфильтровать 10 и 5, используйте 'array_filter()' – Rizier123

+0

, это кажется бесконечным циклом? –

+0

За неверный контур петли. Используйте '$ i == 10' один' = 'присваивает значение, а не тестируя значение – RiggsFolly

ответ

6

Вы, кажется, пропустите, что элементы массива перенумеровываются после splice-operation.

Вы должны отрегулировать петли-переменной:

for($i = 0; $i < sizeof($somevar); $i++) { 
    if($somevar[$i] == 5 || $somevar[$i] == 10) { 
     echo 'the sumvar'.$somevar[$i].' exists<br>'; 
     array_splice($somevar, $i, 1); 
     $i--; 
    } 
} 
+0

ты человек спасения, спасибо большое. – CudoX

Смежные вопросы