我有一个数组,比如['id' => 1, 'name' => 'Fred']
。
我想在这个数组上调用array_map
,同时使用函数中的键。然而,当我返回时,我的密钥将变为int。
简单示例:
$arr = array('id' => 1, 'name' => 'Fred');
$result = array_map(
function ($value, $key) {
return $value;
},
$arr,
array_keys($arr)
);
var_dump($result);
基本上,在这种情况下,我希望$result
与$arr
相同,但它将我的字符串键转换为int。
对于您的"我想调用array_map";以及"$结果与$arr"相同;,尝试:
$result = array_combine(
array_keys($arr),
array_map(function($v){ return $v; }, $arr)
);
提供:
[
"id" => 1
"name" => "Fred"
]
但是,嘿,如果你想要的只是相同的数组,那么没有什么能比得上这个代码:
$result = $arr;
使用array_map()
最接近的是:
<?php
$arr = array('id'=>1,'name'=>'Jon');
$callback = function ($key, $value) {
return array($key => $value);
};
$arr = array_map( $callback, array_keys($arr), $arr);
var_dump($arr);
?>
提供:
[
[
"id" => 1
],
[
"name" => "Jon"
]
]
你会更好地创建自己的函数与foreach
内。
您需要的是array_walk()
。试试这个代码:
$arr = array('id' => 1, 'name' => 'Fred');
array_walk(
$arr,
function (&$value, $key) {
// do stuff
}
);
print_r($arr);
不幸的是,它无法更改键,但如果回调通过引用使用它们,则可以更改值。
如果你也必须更改密钥,请查看我关于用array_walk()
重新索引的另一个答案。
基于@Jannie Theunissen的答案,获得array_map的正确方法是使用键来比较和分配基于第二个数组的值,例如:
$result = array_combine(
array_keys($arr),
array_map(function($v, $key){ return $v; }, $arr, array_keys($arr))
);
或者对于优化的替代方案:
$keys = array_keys($arr);
$result = array_combine(
$keys,
array_map(function($v, $key){ return $v; }, $arr, $keys)
);
并使用比较数组值:
$compareArray = [/*same structure as $arr but with specific values*/];
$keys = array_keys($arr);
$result = array_combine(
$keys,
array_map(function($v, $key) use ($compareArray) {
// recursive can be achieved here passing $v and $compareArray[$key]
return $compareArray[$key];
}, $arr, $keys)
);
这个想法很简单。您需要在array_map()函数中使用键。
为此,我们添加了两个数组:第一个array_keys($array)
我们传递主数组的密钥,第二个$array
是所需的数组。
array_map(function($key, $value) {
// use your key here ...
return $processed_value;
}, array_keys($array), $array)
从现在起:您可以使用$key
作为第一个参数的值,使用$value
作为第二个参数。
我想我没有想到这个,但我也不记得我从哪里得到的。
此函数是通用的,具有与array_map()
相同的可变签名,但保留传递的第一个数组的键,回调将当前键作为第一个arg,将值作为后续arg,如function ($k, $v, $v2, ..., $vn) {
(而array_map()
仅获取数组值)。
function array_map_assoc(callable $callback, array $array, array ...$arrays) {
$keys = array_keys($array);
array_unshift($arrays, $keys, $array);
return array_combine($keys, array_map($callback, ...$arrays));
}
示例:https://3v4l.org/9XQF9
这里的其他示例使用function ($v, $k) {
作为回调签名,但它们仅限于一个输入数组,并且在接受多个输入数组时,将键放在值的中间是没有意义的。