更改数组的所有键

时间:2017-05-23 18:12:59

标签: php arrays dictionary array-map

我有一个名为$row的数组:

$row = array(
    "comments" => "this is a test comment", 
    "current_path" => "testpath"
)

我有另一个名为$dictionary的数组:

$dictionary= array(
    "comments" => "comments", 
    "current_directory" => "current_path"
)

我想将$row中的密钥更改为与$dictionary中的匹配值关联的密钥。

例如,在上面的情况中,$row将成为:

$row = array(
    "comments" => "this is a test comment", 
    "current_directory" => "testpath"
)

我尝试使用array_map,但这似乎没有改变任何事情:

array_map(function($key) use ($dictionary){
  return array_search($key, $dictionary);
}, array_keys($row)); 

如何正确更改密钥?

评论说明:

  

不幸的是,$ dictionary中通常会有更多条目,然后是$ row,并且无法保证订单

3 个答案:

答案 0 :(得分:1)

如果可以翻转$dictionary,那么

$dictionary = array_flip($dictionary);

$result = array_combine(
    array_map(function($key) use ($dictionary){ 
        return $dictionary[$key]; 
    }, array_keys($row)),
    $row
);

如果没有,那么你最好做一个手动循环。

答案 1 :(得分:1)

在您的案例解决方案中有一些潜在的“问题”。由于您的两个数组可能没有相同的大小,因此您必须在循环内使用array_search()。此外,虽然您的案例似乎不太可能,但我想提一句,如果$dictionary有密钥:"0"0,那么array_search()的返回值必须严格检查false。这是我推荐的方法:

输入:

$row=array(
    "comments"=>"this is a test comment", 
    "title"=>"title text",                      // key in $row not a value in $dictionary
    "current_path"=>"testpath"
);

$dictionary=array(
    "0"=>"title",                               // $dictionary key equals zero (falsey)
    "current_directory"=>"current_path",
    "comments"=>"comments", 
    "bogus2"=>"bogus2"                          // $dictionary value not a key in $row
);

方法(Demo):

foreach($row as $k=>$v){
    if(($newkey=array_search($k,$dictionary))!==false){  // if $newkey is not false
        $result[$newkey]=$v;                    // swap in new key
    }else{
        $result[$k]=$v;                         // no key swap, store unchanged element
    }
}
var_export($result);

输出:

array (
  'comments' => 'this is a test comment',
  0 => 'title text',
  'current_directory' => 'testpath',
)

答案 2 :(得分:0)

我只是做一个手动循环并输出到一个新变量。 你不能使用array_map或array_walk来改变数组的结构。

<?php
   $row = ["comments" =>"test1", "current_path" => "testpath"];

   $dict = ["comments" => "comments", "current_directory" => "current_path"];

    foreach($row as $key => $value){
       $row2[array_search($key, $dict)] = $value;
   };

  var_dump($row2);

 ?>