在取消设置元素后重新生成数组键

TuK*_*TuK 168 php

我有一个数组:

$array = array(1,2,3,4,5);
Run Code Online (Sandbox Code Playgroud)

如果我要转储数组的内容,它们将如下所示:

array(5) {
  [0] => int(1)
  [1] => int(2)
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}
Run Code Online (Sandbox Code Playgroud)

当我循环并取消设置某些键时,索引全部被抬起.

foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    unset($array[$i]);
  }
}
Run Code Online (Sandbox Code Playgroud)

随后,如果我现在做了另一个转储,它看起来像:

array(3) {
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}
Run Code Online (Sandbox Code Playgroud)

有没有一种正确的方法来重置数组,所以它的元素再次为零?

array(3) {
  [0] => int(3)
  [1] => int(4)
  [2] => int(5)
}
Run Code Online (Sandbox Code Playgroud)

Nea*_*eal 381

试试这个:

$array = array_values($array);
Run Code Online (Sandbox Code Playgroud)

使用array_values()

  • 是的,订购肯定是保持.如果它重新排序它将是一个可怕的功能!:) (15认同)
  • +1.我注意到手册没有明确说明将保持订购,但我不明白为什么它不会. (4认同)
  • 总是寻求简单明了的解决方案:) (2认同)

Web*_*per 14

有另一个有趣的方法:

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

$array = array_merge($array); 
Run Code Online (Sandbox Code Playgroud)

现在$ array键被重置.


Dem*_*cht 12

使用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);
Run Code Online (Sandbox Code Playgroud)

在这里工作样本.

  • 这不起作用.splice会很棒,但是你不能在for/foreach循环中使用它,因为每次调用它时都会重新排列索引,所以foreach循环的索引不是指向下一个元素而是指向具有该位置的元素在重新排列的阵列上.你可以在例子中看到你删除值'3'并且当你应该只删除值'1'和'2'时保留值'2' (7认同)

SpY*_*3HH 5

只是一种添加剂.

我知道这是旧的,但我想添加一个解决方案,我没有看到我想出了自己.在找到一个不同的解决方案时发现了这个问题,并且只是想到,"好吧,我在这里的时候."

首先,在你运行循环之后,Neal的答案很好并且很好用,但是,我宁愿一次完成所有工作.当然,在我的具体情况下,我必须做比这个简单示例更多的工作,但该方法仍然适用.我看到其他几个人建议foreach循环,然而,由于野兽的性质,这仍然留给你下班.通常我会建议更简单的事情foreach,但是,在这种情况下,最好记住良好的老式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--;
    }
}
Run Code Online (Sandbox Code Playgroud)

将输出:

array(3) {
    [0]=> int(3)
    [1]=> int(4)
    [2]=> int(5)
}
Run Code Online (Sandbox Code Playgroud)

这可以有许多简单的实现.例如,我的确切情况需要根据多维值保存数组中的最新项.我会告诉你我的意思:

$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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

将输出:

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"
        }
}
Run Code Online (Sandbox Code Playgroud)

如你所见,我在拼接之前操纵$ i,因为我正在寻找删除前一个而不是现在的项目.