取消设置元素后重新设置数组键的基数


183

我有一个数组:

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

Answers:


411

试试这个:

$array = array_values($array);

使用array_values()


6
+1。我注意到该手册没有明确指出将保持顺序,但是我不明白为什么不这样做。
Lightness Races in Orbit

16
是的,订购肯定得到维护。如果重新排序,它将是一个可怕的功能!:)
webbiedave

1
@webbiedave对不起,但这不是事实。它实际上对我的数组重新排序。非常非常奇怪。
FooBar 2014年

4
总是寻求简单的简洁解决方案:)
Bruce Lim 2014年

1
尽管在对数组进行编号后,这是一个简单的解决方案,但是当键设置为文本时,它就无法工作,就像将其作为HTML表单的一部分一样。如果您依靠唯一的键值来标识表单的输出,则以下方法之一会更好。

17

有另一种有趣的方法:

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

$array = array_merge($array); 

现在$ array键被重置。


13

使用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);

这里的工作样本


7
这是行不通的。拼接会很棒,但是您不能在for / foreach循环中使用它,因为每次调用它都会重新排列索引,因此foreach循环的索引不会指向下一个元素,而是指向该位置的元素在重新排列的数组上。您可以在示例中看到,当您只应删除值“ 1”和“ 2”时,您将删除值“ 3”并保留值“ 2”
NotGaeL 2013年

1
@elcodedocle然后不要使用foreach循环。使用标准i Loop,只需在拼接后重设i即可。另外,Working sample here.是行不通的。
SpYk3HH 2014年

链接断开,您可以修复它吗?
米歇尔·艾尔斯2014年

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--;
    }
}

将输出:

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

答案较晚,但是在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

或者,您可以创建自己的函数,该函数通过引用传递数组。

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并且键已重置




-2

在我的情况下,我需要使用数组值保留唯一键,因此我只使用了第二个数组:

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

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);

1)您unset($arr1)将使其无法在循环中进行迭代。2)您缺少倒数第二行的分号。此代码段将无法运行。
Rockin4Life33
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.