鍍金池/ 問答/數(shù)據(jù)分析&挖掘  PHP/ PHP 怎么樣將 Array 的 key 統(tǒng)一加上前綴 ?

PHP 怎么樣將 Array 的 key 統(tǒng)一加上前綴 ?

比如

$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 之類的函數(shù)實現(xiàn)?

回答
編輯回答
北城荒

<?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;

2017年10月7日 00:39
編輯回答
怪痞

array_map array_walk array_filter 等都可以實現(xiàn)這樣的操作。
出發(fā)點就是,每個函數(shù)有沒有自帶對數(shù)組的遍歷。

array_map 有個缺點是需要單獨取一次 key,這樣增加了代碼的復雜度。
建議可以使用 array_walk,然后利用閉包的特性。
array_walk 實現(xiàn)代碼如下:

    $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

我們發(fā)現(xiàn)差別幾乎是 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();
2018年6月13日 03:37
編輯回答
神曲

大哥,代碼不一定要追求函數(shù)用的6,你的算法已經(jīng)非常簡潔了.

<?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;
2017年7月18日 13:15
編輯回答
扯機薄

用另一個數(shù)組接收

$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",
    ];
2018年7月5日 08:15
編輯回答
黑與白

第一反應是鍵值翻轉再array_map處理 仔細一想值相同會有問題
然后就通過array_combine組合
話說樓上array_map的用法以前確實沒用過(大于2個參數(shù))

$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使用了三個參數(shù)還專門去看了下文檔
PS: 再汗
原來是樓上更新了...

2018年5月21日 04:20
編輯回答
落殤

要我說實話嗎?上面一個沒你的快,你可以試試大一點的數(shù)組

2018年5月11日 02:14
編輯回答
淡墨

這個得寫代碼了

2017年8月20日 09:24
編輯回答
孤客
<?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
)


圖片描述

2017年3月4日 22:14