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

我有一个数组:

$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)
}
144265 次浏览

试试这个:

$array = array_values($array);

使用元素()

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

这里的工作样本

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

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中的值,键被重置

只是一个加法。

我知道这是旧< em > < / em >,但我想添加一个解决方案,我没有看到我自己提出的。在寻找不同的解决方案时发现了这个问题,然后就想:“好吧,既然我在这里。”

首先,尼尔的答案在你运行循环后使用是很好的,但是,我更喜欢一次性完成所有工作。当然,在我的具体情况下,我必须做更多的工作,而不是这个简单的例子,但这个方法仍然适用。我看到其他人建议foreach循环,然而,由于野兽的性质,这仍然留给你下班后。通常我建议使用更简单的东西,比如foreach,但是,在这种情况下,最好记住老式的for loop逻辑。简单地使用i!要保持适当的索引,只需在每次删除数组项后从i中减去。

下面是我简单的< em > < / em >工作例子:

$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,因为我试图删除前一项,而不是当前项。

还有一个有趣的方法:

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


$array = array_merge($array);

现在$array键被重置。

晚回答但是,在php5.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);

我使用$arr = array_merge($arr);来改变数组的基数。简单明了。

百分百为我工作!在数组中取消设置元素后,您可以使用此方法重新索引数组

$result=array_combine(range(1, count($your_array)), array_values($your_array));