Rebase array keys after unsetting elements

Php

Php Problem Overview


I have an array:

$array = array(1,2,3,4,5);

If I were to dump the contents of the array they would look like this:

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

When I loop through and unset certain keys, the index gets all jacked up.

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

Subsequently, if I did another dump now it would look like:

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

Is there a proper way to reset the array so it's elements are Zero based again ??

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

Php Solutions


Solution 1 - Php

Try this:

$array = array_values($array);

Using array_values()

Solution 2 - Php

Got another interesting method:

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

$array = array_merge($array); 

Now the $array keys are reset.

Solution 3 - Php

Use array_splice rather than 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);

Working sample here.

Solution 4 - Php

Just an additive.

I know this is old, but I wanted to add a solution I don't see that I came up with myself. Found this question while on hunt of a different solution and just figured, "Well, while I'm here."

First of all, Neal's answer is good and great to use after you run your loop, however, I'd prefer do all work at once. Of course, in my specific case I had to do more work than this simple example here, but the method still applies. I saw where a couple others suggested foreach loops, however, this still leaves you with after work due to the nature of the beast. Normally I suggest simpler things like foreach, however, in this case, it's best to remember good old fashioned for loop logic. Simply use i! To maintain appropriate index, just subtract from i after each removal of an Array item.

Here's my simple, working example:

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

Will output:

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

This can have many simple implementations. For example, my exact case required holding of latest item in array based on multidimensional values. I'll show you what I mean:

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

Will output:

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

As you see, I manipulate $i before the splice as I'm seeking to remove the previous, rather than the present item.

Solution 5 - Php

I use $arr = array_merge($arr); to rebase an array. Simple and straightforward.

Solution 6 - Php

100% working for me ! After unset elements in array you can use this for re-indexing the array

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

Solution 7 - Php

Or you can make your own function that passes the array by reference.

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

So then all you have to do is...

$unsets = array(1,2);
array_unset($unsets, $array);

... and now your $array is without the values you placed in $unsets and the keys are reset

Solution 8 - Php

Late answer but, after PHP 5.3 could be so;

$array = array(1, 2, 3, 4, 5);
$array = array_values(array_filter($array, function($v) {
    return !($v == 1 || $v == 2);
}));
print_r($array);

Solution 9 - Php

In my situation, I needed to retain unique keys with the array values, so I just used a second 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);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTuKView Question on Stackoverflow
Solution 1 - PhpNaftaliView Answer on Stackoverflow
Solution 2 - PhpWeb_DeveloperView Answer on Stackoverflow
Solution 3 - PhpDemian BrechtView Answer on Stackoverflow
Solution 4 - PhpSpYk3HHView Answer on Stackoverflow
Solution 5 - PhpRockin4Life33View Answer on Stackoverflow
Solution 6 - PhpAtta Ur RehmanView Answer on Stackoverflow
Solution 7 - PhpupfulView Answer on Stackoverflow
Solution 8 - PhpK-GunView Answer on Stackoverflow
Solution 9 - PhpJohn KView Answer on Stackoverflow