PHP 怎么样将 Array 的 key 统一加上前缀 ?

发布于 2022-09-06 05:27:46 字数 441 浏览 21 评论 0

比如

$array = [
    "version"    => "1.1",
    "connection" => "close",
];

变成

$array = [
    "http_version"    => "1.1",
    "http_connection" => "close",
];


“简单”的方法是:

$arrayPrefix = [];
foreach ($array as $key => $value) {
    $arrayPrefix['prefix_' . $key] = $value;
}

$array = $arrayPrefix;

有没有可能用 array_map 之类的函数实现?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

你是年少的欢喜 2022-09-13 05:27:46

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 进行基准测试,来说明时间复杂度的差别。
结果如下:

clipboard.png

我们发现差别几乎是 2 倍 的。所以要考虑一下为什么不用 foreach

基准测试代码如下:

<?php
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();
高跟鞋的旋律 2022-09-13 05:27:46

大哥,代码不一定要追求函数用的6,你的算法已经非常简洁了.

<?php
$array = [
    "version"    => "1.1",
    "connection" => "close",
];

array_map(function($item)use(&$array){
    $array['http_'.$item] = $array[$item];
    unset($array[$item]);
},array_keys($array));

print_r($array);exit;
疯狂的代价 2022-09-13 05:27:46

这个得写代码了

2022-09-13 05:27:46
<?php
$array = [
    "version"    => "1.1",
    "connection" => "close",
];
$c=array_combine(array_map(function($v){return "http_".$v;},array_keys($array)),array_values($array));
print_r($c);


Array
(
    [http_version] => 1.1
    [http_connection] => close
)


图片描述

沧桑㈠ 2022-09-13 05:27:46

<?php

header('content-type:text/html;charset=utf8');
$array = [

"version"    => "1.1",
"connection" => "close",

];

foreach ($array as $key => $value)
{

$array["http_".$key] = $value;
unset($array[$key]);

}
var_dump($array);exit;

维持三分热 2022-09-13 05:27:46

用另一个数组接收

$array = [
    "version"    => "1.1",
    "connection" => "close",
];
例 :$arr=[];
    $arr["http_version"]=$array["version"];
    $arr["http_connection"]=$array["connection"];
    
    var_dump($arr);
    
    
    $arr = [
        "http_version"    => "1.1",
        "http_connection" => "close",
    ];
梦行七里 2022-09-13 05:27:46

第一反应是键值翻转再array_map处理 仔细一想值相同会有问题
然后就通过array_combine组合
话说楼上array_map的用法以前确实没用过(大于2个参数)

$array = [
    "version"    => "1.1",
    "connection" => "close",
];

$result = array_combine(array_map(function($key){
    return "http_" . $key;
}, array_keys($array)), array_values($array));

print_r($result);

PS: 汗!!!
好吧楼上就是这样的想法... 不仔细看我还以为是array_map使用了三个参数还专门去看了下文档
PS: 再汗
原来是楼上更新了...

骷髅 2022-09-13 05:27:46

要我说实话吗?上面一个没你的快,你可以试试大一点的数组

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文