1

How do I re-index an array starting from a specific number rather than 0.

I know it can be done by simply looping through the array and creating a new array with the Key => Value with the key being the custom number, and then just incrementing it in every iteration.

$custom_index = 5;
$output = [];
foreach($input as $val){
 $output[$custom_index++] = $val;
}

Is there any other (maybe better?) way to set the index with custom start for an array in php?

0

3 Answers 3

4

Probably not better, but here's another way to do this:

$customIndex = 5;
$output = [];
// example input array
$input = [1,2,3,4,5];

$indexes = range($customIndex, $customIndex + count($input) - 1);
$output = array_combine($indexes, $input);

var_dump($output);

// prints out: 
array(5) {
[5]=>
int(1)
[6]=>
int(2)
[7]=>
int(3)
[8]=>
int(4)
[9]=>
int(5)
}
Sign up to request clarification or add additional context in comments.

Comments

1

You also can use functions to implement re-index if you dont really need the actual re-indexing .

function get_array_index(&$array, $index, $index_start=0)
{
    return $array[$index_start - $index] ;
}

You probably should make new functions to use your array.

I wrote 2 functions so i can re-index the array for fake .

function array_get(&$array, $index, $index_start=0)
{
    return $array[$index - $index_start] ;
}
function array_set(&$array, $index, $val, $index_start=0)
{
    $array[$index - $index_start] = $val;
}

$index_start = 0 ;  // what is the first offset

// input 
$input = [1,2,3,4,5] ;

// get index 0
echo $input[0] ; // 1 ; this line refer is actuall array
echo '<br/>';
echo array_get($input, 0, $index_start) ; // 1 ; this is what we goona use for re-indexing purpose
echo '<br/>';

// get index 2
echo $input[2] ; // 3 
echo '<br/>';
echo array_get($input, 2, $index_start) ; // 3
echo '<br/>';

// reset $input[2] 
array_set($input, 2, 12, $index_start) ; // change 3 -> 12
echo array_get($input, 2, $index_start) ; // 12
echo '<br/>';


// let's re-index array 
$index_start = 5 ;  // first index is 5 now


// it's seems to a re-index happend but the actuall array did'nt changed

echo array_get($input, 5, $index_start) ; // must be 1
echo '<br/>';
echo array_get($input, 6, $index_start) ; // must be 2
echo '<br/>';
echo array_get($input, 7, $index_start) ; // must be 12
echo '<br/>';
echo array_get($input, 8, $index_start) ; // must be 4
echo '<br/>';
echo array_get($input, 9, $index_start) ; // must be 5
echo '<br/>';

// reset $input[9] 
array_set($input, 9, 15, $index_start) ; // change 5 -> 15
echo array_get($input, 9, $index_start) ; // 15
echo '<br/>';

If you need to re-index the array in real this functions wont help you .

3 Comments

Maybe I'm missing something, how am I going to use it, could you please elaborate?
updated the answer. please remember this code wont re-index the array in real. in the case that you just need a simple array set and retrive maybe you can use this one.
Hmm, I get it now, this method is good for logical reindex but then it need writing a lot of helper functions for interacting with that array. Though I see some applications for this method where this might be just the right choice. Upvoted.
1

Another alternative (probably not the best) can be something like this:

$array = array("five","six","seven");
$result = array_flip(array_map(function($n){
   return($n+5); // custom index
}, array_flip($array)));

print_r($result);

Output is :

Array ( [5] => five [6] => six [7] => seven ) 

We can use array_flip combined with array_map, first we switch index and values, so array_map can increment the values of the array, and then we'll switch back values and indexes.

Edit:

This is a rough comparison of performances between my code,yours and @William Janoti

$time_start = microtime(true);
$array = array_fill (0,100000,"test");
$result = array_flip(array_map(function($n){ return($n+5);}, array_flip($array)));     
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Process Time 1: {$time}";

$time_start = microtime(true);
$input =  array_fill (0,100000,"test");
$custom_index = 5;
$output = [];
foreach($input as $val){
 $output[$custom_index++] = $val;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Process Time 2: {$time}";



$time_start = microtime(true);
$customIndex = 5;
$output = [];
// example input array
$input = array_fill (0,100000,"test");
$indexes = range($customIndex, $customIndex + count($input) - 1);
$output = array_combine($indexes, $input);
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "Process Time 3: {$time}";

Result :

Process Time 1: 0.012617826461792  
Process Time 2: 0.026544094085693  
Process Time 3: 0.028899908065796

4 Comments

If am not worng, One gotcha for this method is, we can't have duplicate values otherwise when the array will be flipped the value now(key) will be overwritten with the last duplicate of itself.
@9KSoft thats true
The times are depending on version, some versions are on par or faster. And with the unique values issue that means array_combine wins in my book
@Andreas i agree

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.