Перебазировать ключи массива после сброса элементов - PullRequest
165 голосов
/ 10 мая 2011

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

$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]);
  }
}

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

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

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

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

Ответы [ 8 ]

374 голосов
/ 10 мая 2011

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

$array = array_values($array);

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

14 голосов
/ 20 июня 2014

Есть еще один интересный метод:

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

$array = array_merge($array); 

Теперь ключи $ array сброшены.

12 голосов
/ 10 мая 2011

Используйте 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);

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

5 голосов
/ 23 января 2014

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

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

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

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

$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 перед соединением, пытаясь удалить предыдущий, а не настоящий товар.

1 голос
/ 02 февраля 2015

Поздний ответ, но после 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);
1 голос
/ 16 сентября 2013

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

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, а ключи сброшены

0 голосов
/ 07 марта 2019

Я использую $arr = array_merge($arr);, чтобы перебазировать массив. Просто и понятно.

0 голосов
/ 07 января 2016

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

$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...