89

My array looks like this:

array(
  0 => 'val',
  2 => 'val',
  3 => 'val',
  5 => 'val',
  7 => 'val'
);

How can I reset the keys so it will go like 0, 1, 2, 3, 4?

1
  • Use a foreach loop and missing index is not an issue. I use a for loop on an array and the missing index cause a problem. Commented Jul 29, 2019 at 3:07

6 Answers 6

187

Use array_values:

$reindexed_array = array_values($old_array);
Sign up to request clarification or add additional context in comments.

7 Comments

array values, though valid, is not what I'd recommend. Internally, it calls the array constructor, and returns a new array. using sort is therefore (marginally) faster, and shorter to write, too
i dont need to use another array.. i simply array_values() the current one
Elias, a simple benchmark will show you that sort is never faster. It's very slow for large arrays and the memory difference is minimal for small ones. I see no reason to use sort (which also have possibly unwanted side-effects).
We all need to buy new phones often, because programmers don't care about saving memory. Why is this answer so more voted than @Rawkode's, below?
@Rodrigo Because for most PHP developers CPU cores are more expensive than memory (we have gigabytes of unused RAM on all our FPM servers). And most of us do web development where response time is important. My answer is faster and uses less CPU. My answer is also more elegant because it answers the original question with no other side effects. If you don't agree with this then fine, but your rant about phones seems very unfair because I am one of those who do care about performance. I'm only saying that creating a new array in O(n) time is MORE performant than sorting it in O(n log n) time.
On shared hosting, memory is limited to a (often very low) fixed amount.
|
23
array_splice($old_array, 0, 0);

It will not sort array and will not create a second array

1 Comment

Not creating a second array could help reduce memory footprint, depending how array_splice works internally. It's less clear to the reader than array_values, but may be more optimal (TBD).
9

By using sort($array);

See PHP documentation here.

I'd recommend sort over array_values as it will not create a second array. With the following code you now have two arrays occupying space: $reindexed_array and $old_array. Unnecessary.

$reindexed_array = array_values($old_array);

9 Comments

but i dont need to use a new array for array_values since i can do $array = array_values($array)
sort is much slower than array_values. The time complexity of array_values is O(n) while sort is O(n log n) in the best case. A simple benchmark will show you that array_values is faster than sort in all cases, especially for larger arrays (a million entries took over a second to sort on my computer, while array_values was ten times faster). Also, what if fxuser don't want to sort the values?
@fxuser Even using $a = array_values($a) you are still creating a second array behind the scenes and this will boost your memory usage.
Yes, sort may be valid but it is way slower, especially for large arrays (those where memory matters).
This answer will be wrong anytime the values are not already in ascending order. It should not have 11 upvotes -- it is only correct because of the scenario posted in the question.
|
4

From PHP7.4, you can reindex without a function call by unpacking the values into an array with the splat operator. Consider this a "repack".

Code: (Demo)

$array = array(
  0 => 'val',
  2 => 'val',
  3 => 'val',
  5 => 'val',
  7 => 'val'
);

$array = [...$array];

var_export($array);

Output:

array (
  0 => 'val',
  1 => 'val',
  2 => 'val',
  3 => 'val',
  4 => 'val',
)

Note: this technique will NOT work on associative keys (the splat operator chokes on these). Non-numeric demo

The breakage is reported as an inability to unpack string keys, but it would be more accurate to say that the keys must all be numeric. Integer as string demo and Float demo

1 Comment

1

It's worth pointing out that the array in the question is a very special case, where all values are the same and keys are already in ascending order. If you have an array with different values and keys in any random order, and you want to sort it by key and reindex the keys, the existing answers will not do what you expect.

For example, if you have something like this:

[
    7 => 'foo',
    0 => 'bar',
    2 => 42
];

and you want to end up with this:

[
    0 => 'bar',
    1 => 42,
    2 => 'foo',
]

you can't just use array_values(), array_splice() or sort(), because you would end up with

[
    0 => 'foo',
    1 => 'bar',
    2 => 42,
]

Instead, you first need to sort the array based on the keys, using ksort(), and then reindex the keys using array_values():

$arr = [
    7 => 'foo',
    0 => 'bar',
    2 => 42
];

ksort($arr, SORT_NUMERIC);
$arr = array_values($arr);

Result:

[
    0 => 'bar',
    1 => 42,
    2 => 'foo',
]

2 Comments

This task has creeped too far from the posted question. This question is in no way about sorting. This answer solves an "invented" (non-posted) concern.
The opening paragraph here would make a very good comment to any answer that suggests using sort. But it's not an answer itself.
0
array_splice($jam_array, 0, count($jam_array));

To sort an array with missing intermediate indices, with count the order is more secure. So 0 is the first index and count($jam_array) or sizeof($jam_array) return the decimal position of the array, namely, last index.

1 Comment

Surely this will just remove all elements from the array. Also array_splice does not sort the array, and the OP did not ask for the array to be sorted anyway, just reindexed.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.