在取消设置元素后重新排列数组键

我有一个数组:

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

尝试这个:

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

现在$数组键被重置。

只是一个添加剂。

我知道这是旧的 ,但我想增加一个解决scheme,我没有看到我自己想出了。 在寻找不同的解决scheme时发现了这个问题,只是想:“呃,当我在这里。”

首先, 尼尔的答案在你运行循环之后很好用,但是,我宁愿一下子做所有的工作。 当然,在我的具体情况下,我不得不做比这个简单的例子更多的工作,但是这个方法仍然适用。 我看到其他人build议foreach循环,但是,由于野兽的性质,这仍然留给你下class后 。 通常情况下,我build议像foreach这样简单的事情,但是,在这种情况下,最好记住老式for loop逻辑。 只需使用i ! 为了保持适当的索引,只需在每次删除一个Array项目后从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,因为我正在寻求删除之前的而不是现在的项目。

或者你可以使自己的函数通过引用传递数组。

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