array_map array_walk array_filter 等都可以实现这样的操作。
出发点就是,每个函数有没有自带对数组的遍历。
array_map 有个缺点是需要单独取一次 key,这样增加了代码的复杂度。
建议可以使用 array_walk,然后利用闭包的特性。
array_walk 实现代码如下:
$array = [
"version" => "1.1",
"connection" => "close",
];
$new_arr = array();
array_walk($array, function ($value, $key) use (&$new_arr) {
$new_arr['http_' . $key] = $value;
});
var_dump($new_array);
注意!!!
类似题中的处理,这些方法都有一个特别大的缺点,时间复杂度比 foreach 高。
对 foreach array_walk array_map 进行基准测试,来说明时间复杂度的差别。
结果如下:
我们发现差别几乎是 2 倍 的。所以要考虑一下为什么不用 foreach。
基准测试代码如下:
error_reporting(E_ALL | E_STRICT);
define('ITERATIONS', 2000000);
class Bench
{
private $bench_name;
private $start_time;
private $end_time;
public function start($name)
{
$this->bench_name = $name;
$this->start_time = microtime(true);
}
public function end()
{
$this->end_time = microtime(true);
echo "Call style: " . $this->bench_name . '; ' . ($this->end_time - $this->start_time) . " seconds". PHP_EOL;
}
}
function use_foreach($array)
{
$arrayPrefix = [];
foreach ($array as $key => $value) {
$arrayPrefix['http_' . $key] = $value;
}
$array = $arrayPrefix;
}
function use_array_map($array)
{
array_combine(array_map(function($v){return "http_".$v;},array_keys($array)),array_values($array));
}
function use_array_walk($array)
{
$new_arr = array();
array_walk($array, function ($value, $key) use (&$new_arr) {
$new_arr['http_' . $key] = $value;
});
}
$bench = new Bench();
$array = [
"version" => "1.1",
"connection" => "close",
"version2" => "1.1",
"connection2" => "close",
"version3" => "1.1",
"connection3" => "close",
];
$bench->start('use_foreach');
for ($i=0; $i < ITERATIONS; ++$i) {
use_foreach($array);
}
$bench->end();
$bench->start('use_array_walk');
for ($i=0; $i < ITERATIONS; ++$i) {
use_array_walk($array);
}
$bench->end();
$bench->start('use_array_map');
for ($i=0; $i < ITERATIONS; ++$i) {
use_array_map($array);
}
$bench->end();