从特定数字重新索引数组

时间:2018-08-06 07:33:23

标签: php arrays

如何从特定数字而不是0开始重新索引数组。

我知道可以做到这一点,只需循环遍历数组并使用Key => Value创建一个新数组,其键为自定义数字,然后在每次迭代中将其递增即可。

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

是否还有其他(可能更好?)的方法来为PHP中的数组自定义启动设置索引?

3 个答案:

答案 0 :(得分:4)

可能不会更好,但这是另一种方法:

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

答案 1 :(得分:1)

另一种替代方法(可能不是最好的)可能是这样的:

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

print_r($result);

输出为:

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

我们可以将array_fliparray_map结合使用,首先我们切换索引和值,所以array_map可以增加数组的值,然后我们切换回值和索引

修改

这是我的代码,您的代码和@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}";

结果:

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

答案 2 :(得分:0)

如果您确实不需要实际的重新索引编制,还可以使用函数来实现重新编制索引。

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

您可能应该使用新函数来使用数组。

我编写了2个函数,因此可以为假数组重新索引。

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/>';

如果您实际上需要重新索引数组,则此功能将无济于事。