如何从特定数字而不是0开始重新索引数组。
我知道可以做到这一点,只需循环遍历数组并使用Key => Value
创建一个新数组,其键为自定义数字,然后在每次迭代中将其递增即可。
$custom_index = 5;
$output = [];
foreach($input as $val){
$output[$custom_index++] = $val;
}
是否还有其他(可能更好?)的方法来为PHP中的数组自定义启动设置索引?
答案 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_flip
与array_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/>';
如果您实际上需要重新索引数组,则此功能将无济于事。