我有一个名为$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,并且无法保证订单
答案 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);
?>