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?
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?
array_splice($old_array, 0, 0);
It will not sort array and will not create a second array
array_splice works internally. It's less clear to the reader than array_values, but may be more optimal (TBD).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);
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?sort may be valid but it is way slower, especially for large arrays (those where memory matters).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
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',
]
sort. But it's not an answer itself.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.
array_splice does not sort the array, and the OP did not ask for the array to be sorted anyway, just reindexed.