How to Remove Array Element and Then Re-Index Array?

PhpArraysIndexing

Php Problem Overview


I have some troubles with an array. I have one array that I want to modify like below. I want to remove element (elements) of it by index and then re-index array. Is it possible?

$foo = array(

	'whatever', // [0]
	'foo', // [1]
	'bar' // [2]

);

$foo2 = array(

	'foo', // [0], before [1]
	'bar' // [1], before [2]

);

Php Solutions


Solution 1 - Php

unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

Solution 2 - Php

Solution 3 - Php

You better use array_shift(). That will return the first element of the array, remove it from the array and re-index the array. All in one efficient method.

Solution 4 - Php

array_splice($array, array_search(array_value, $array), 1);

Solution 5 - Php

Unset($array[0]); 

Sort($array); 

I don't know why this is being downvoted, but if anyone has bothered to try it, you will notice that it works. Using sort on an array reassigns the keys of the the array. The only drawback is it sorts the values. Since the keys will obviously be reassigned, even with array_values, it does not matter is the values are being sorted or not.

Solution 6 - Php

2020 Benchmark in PHP 7.4

For these who are not satisfied with current answers, I did a little benchmark script, anyone can run from CLI.

We are going to compare two solutions:

unset() with array_values() VS array_splice().

<?php

echo 'php v' . phpversion() . "\n";

$itemsOne = [];
$itemsTwo = [];

// populate items array with 100k random strings
for ($i = 0; $i < 100000; $i++) {
    $itemsOne[] = $itemsTwo[] = sha1(uniqid(true));
}

$start = microtime(true);

for ($i = 0; $i < 10000; $i++) {
    unset($itemsOne[$i]);
    $itemsOne = array_values($itemsOne);
}

$end = microtime(true);

echo 'unset & array_values: ' . ($end - $start) . 's' . "\n";

$start = microtime(true);

for ($i = 0; $i < 10000; $i++) {
    array_splice($itemsTwo, $i, 1);
}

$end = microtime(true);

echo 'array_splice: ' . ($end - $start) . 's' . "\n"; 

As you can see the idea is simple:

  • Create two arrays both with the same 100k items (randomly generated strings)
  • Remove 10k first items from first array using unset() and array_values() to reindex
  • Remove 10k first items from second array using array_splice()
  • Measure time for both methods

Output of the script above on my Dell Latitude i7-6600U 2.60GHz x 4 and 15.5GiB RAM:

php v7.4.8
unset & array_values: 29.089932918549s
array_splice: 17.94264793396s

Verdict: array_splice is almost twice more performant than unset and array_values.

So: array_splice is the winner!

Solution 7 - Php

Try with:

$foo2 = array_slice($foo, 1);

Solution 8 - Php

After some time I will just copy all array elements (excluding these unwanted) to new array

Solution 9 - Php

If you use array_merge, this will reindex the keys. The manual states:

> Values in the input array with numeric keys will be renumbered with > incrementing keys starting from zero in the result array.

http://php.net/manual/en/function.array-merge.php

This is where i found the original answer.

http://board.phpbuilder.com/showthread.php?10299961-Reset-index-on-array-after-unset()

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
QuestiondaGrevisView Question on Stackoverflow
Solution 1 - PhpxzyferView Answer on Stackoverflow
Solution 2 - PhpdecezeView Answer on Stackoverflow
Solution 3 - PhpReneView Answer on Stackoverflow
Solution 4 - Phpuser1092222View Answer on Stackoverflow
Solution 5 - PhpfrostymarvelousView Answer on Stackoverflow
Solution 6 - PhpbarellView Answer on Stackoverflow
Solution 7 - PhphszView Answer on Stackoverflow
Solution 8 - PhpMichal - wereda-netView Answer on Stackoverflow
Solution 9 - PhpRichard SkinnerView Answer on Stackoverflow