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

У меня есть массив:

$array = array(1,2,3,4,5); 

Если бы я сбросил содержимое массива, они выглядели бы так:

 array(5) { [0] => int(1) [1] => int(2) [2] => int(3) [3] => int(4) [4] => int(5) } 

Когда я зацикливаюсь и отключаю определенные клавиши, индекс получает все вверх.

 foreach($array as $i => $info) { if($info == 1 || $info == 2) { unset($array[$i]); } } с foreach($array as $i => $info) { if($info == 1 || $info == 2) { unset($array[$i]); } } 

Впоследствии, если бы я сделал еще одну свалку, теперь это будет выглядеть так:

 array(3) { [2] => int(3) [3] => int(4) [4] => int(5) } 

Есть ли способ сбросить массив, чтобы его элементы снова были основаны на Zero?

 array(3) { [0] => int(3) [1] => int(4) [2] => int(5) } 

Попробуй это:

 $array = array_values($array); 

Использование array_values ​​()

Используйте array_splice а не unset :

 $array = array(1,2,3,4,5); foreach($array as $i => $info) { if($info == 1 || $info == 2) { array_splice($array, $i, 1); } } print_r($array); 

Рабочий образец здесь .

Получил еще один интересный метод:

 $array = array('a', 'b', 'c', 'd'); unset($array[2]); $array = array_merge($array); с $array = array('a', 'b', 'c', 'd'); unset($array[2]); $array = array_merge($array); 

Теперь ключи $ array сбрасываются.

Просто добавка.

Я знаю, что это старо , но я хотел добавить решение, которое я не вижу, что я придумал сам. Нашел этот вопрос во время охоты на другое решение и просто подумал: «Ну, пока я здесь».

Прежде всего, ответ Нила хорош и хорош в использовании после того, как вы запустите свой цикл, однако я бы предпочел, чтобы все работали сразу. Конечно, в моем конкретном случае мне пришлось сделать больше работы, чем этот простой пример, но метод все же применяется. Я видел, что пара других предложила петли foreach , однако это все еще оставляет вас после работы из-за природы зверя. Обычно я предлагаю более простые вещи, такие как foreach , однако в этом случае лучше всего вспомнить старую старую форму for loop логики for loop . Просто используйте i ! Чтобы поддерживать соответствующий индекс, просто вычтите из i после каждого удаления элемента Array.

Вот мой простой, рабочий пример:

 $array = array(1,2,3,4,5); for ($i = 0; $i < count($array); $i++) { if($array[$i] == 1 || $array[$i] == 2) { array_splice($array, $i, 1); $i--; } } 

Вывод:

 array(3) { [0]=> int(3) [1]=> int(4) [2]=> int(5) } 

Это может иметь много простых реализаций. Например, мой точный случай требовал хранения последнего элемента в массиве на основе многомерных значений. Я покажу вам, что я имею в виду:

 $files = array( array( 'name' => 'example.zip', 'size' => '100000000', 'type' => 'application/x-zip-compressed', 'url' => '28188b90db990f5c5f75eb960a643b96/example.zip', 'deleteUrl' => 'server/php/?file=example.zip', 'deleteType' => 'DELETE' ), array( 'name' => 'example.zip', 'size' => '10726556', 'type' => 'application/x-zip-compressed', 'url' => '28188b90db990f5c5f75eb960a643b96/example.zip', 'deleteUrl' => 'server/php/?file=example.zip', 'deleteType' => 'DELETE' ), array( 'name' => 'example.zip', 'size' => '110726556', 'type' => 'application/x-zip-compressed', 'deleteUrl' => 'server/php/?file=example.zip', 'deleteType' => 'DELETE' ), array( 'name' => 'example2.zip', 'size' => '12356556', 'type' => 'application/x-zip-compressed', 'url' => '28188b90db990f5c5f75eb960a643b96/example2.zip', 'deleteUrl' => 'server/php/?file=example2.zip', 'deleteType' => 'DELETE' ) ); for ($i = 0; $i < count($files); $i++) { if ($i > 0) { if (is_array($files[$i-1])) { if (!key_exists('name', array_diff($files[$i], $files[$i-1]))) { if (!key_exists('url', $files[$i]) && key_exists('url', $files[$i-1])) $files[$i]['url'] = $files[$i-1]['url']; $i--; array_splice($files, $i, 1); } } } } 

Вывод:

 array(1) { [0]=> array(6) { ["name"]=> string(11) "example.zip" ["size"]=> string(9) "110726556" ["type"]=> string(28) "application/x-zip-compressed" ["deleteUrl"]=> string(28) "server/php/?file=example.zip" ["deleteType"]=> string(6) "DELETE" ["url"]=> string(44) "28188b90db990f5c5f75eb960a643b96/example.zip" } [1]=> array(6) { ["name"]=> string(11) "example2.zip" ["size"]=> string(9) "12356556" ["type"]=> string(28) "application/x-zip-compressed" ["deleteUrl"]=> string(28) "server/php/?file=example2.zip" ["deleteType"]=> string(6) "DELETE" ["url"]=> string(45) "28188b90db990f5c5f75eb960a643b96/example2.zip" } } 

Как вы видите, я манипулирую $ i перед сращиванием, поскольку я пытаюсь удалить предыдущий, а не текущий элемент.

Или вы можете создать свою собственную функцию, которая передает массив по ссылке.

 function array_unset($unsets, &$array) { foreach ($array as $key => $value) { foreach ($unsets as $unset) { if ($value == $unset) { unset($array[$key]); break; } } } $array = array_values($array); } с function array_unset($unsets, &$array) { foreach ($array as $key => $value) { foreach ($unsets as $unset) { if ($value == $unset) { unset($array[$key]); break; } } } $array = array_values($array); } 

Итак, все, что вам нужно сделать, это …

 $unsets = array(1,2); array_unset($unsets, $array); 

… и теперь ваш $array без значений, помещенных в $unsets и ключи сбрасываются

Поздний ответ, но после PHP 5.3 может быть так;

 $array = array(1, 2, 3, 4, 5); $array = array_values(array_filter($array, function($v) { return !($v == 1 || $v == 2); })); print_r($array); 

В моей ситуации мне нужно было сохранить уникальные ключи со значениями массива, поэтому я просто использовал второй массив:

 $arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot"); unset($arr1); $arr2 = array(); foreach($arr1 as $key=>$value) $arr2[$key] = $value; $arr1 = $arr2 unset($arr2); с $arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot"); unset($arr1); $arr2 = array(); foreach($arr1 as $key=>$value) $arr2[$key] = $value; $arr1 = $arr2 unset($arr2);