如何使用array_map函数来处理键和值,并返回一个具有相同索引的数组(而不是整数索引)?

14
我有一个数组,例如['id' => 1, 'name' => 'Fred']
我想在这个数组上调用array_map函数,并在函数内部使用键。然而,当我返回结果时,我的键会变成索引。
简单示例:
$arr = array('id' => 1, 'name' => 'Fred');
$result = array_map(
    function ($value, $key) {
        return $value;
     },
     $arr,
     array_keys($arr)
);
var_dump($result);

基本上,我希望在这种情况下$result$arr完全相同,但不重新索引我的数组。

2
你需要展示你想要的结果。这个程序按照预期工作。 - AbraCadaver
3
根据文档,“如果数组参数包含字符串键,则当且仅当传递一个数组时,返回的数组将包含字符串键。如果传递多个参数,则返回的数组始终具有整数键。”(我强调了一下) - Patrick Q
array_map() 不是此工作的合适工具。请展示您实际想要用这些数据做什么。 - mickmackusa
这个问题的问题陈述不清楚,因此应该由提问者关闭或编辑此页面。 - undefined
array_map()函数在只传入数组时不会删除键。如果传入多个数组,它无法确定要保留哪些键。这似乎是一个XY问题 - undefined
6个回答

25

如果您需要“调用array_map”并且“$result与$arr完全相同”,请尝试:

$result = array_combine(
     array_keys($arr), 
     array_map(function($v){ return $v; }, $arr)
);

给:

   [
     "id" => 1
     "name" => "Fred"
   ]

但是,如果你只想要相同的数组,那么没有什么比这段代码更好:

$result = $arr;

3
这不是一个好的通用解决方案,因为转换函数无法访问当前键。 - Walf

14

使用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循环创建自己的函数。


问题要求原始键,而不是带有整数键的嵌套数组。 - Walf

4
你需要的是 array_walk()。 试试这段代码:
$arr = array('id' => 1, 'name' => 'Fred');
array_walk(
    $arr,
    function (&$value, $key) {
        // do stuff
    }
);
print_r($arr);

很遗憾,它无法更改键,但如果您的回调函数通过引用使用它们,您可以更改值。
如果您还需要更改键,请查看我关于使用array_walk()重新索引的其他答案。

2

根据@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)
);

0

我不认为这是我想出来的,但我也不记得我从哪里得到它了。

这个函数是通用的,具有与array_map()相同的可变参数签名,但保留了传递的第一个数组的键,并且回调函数将当前键作为第一个参数和值作为后续参数,例如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) {,但它们仅限于一个输入数组,并且在接受多个输入数组时,在值之间插入键并不合理。


0

这个想法非常简单。您需要在array_map()函数中使用键。

为此,我们添加了两个数组:第一个是array_keys($array),我们将主数组的键传递给它,第二个是$array所需的数组。

array_map(function($key, $value) {

       // use your key here ...
       return $processed_value;

    }, array_keys($array), $array)

从现在开始:您可以将$key用作第一个参数的值,将$value用作第二个参数。


3
如果您能在解决方案中添加一些说明性词语,那就太好了。 - mooga
2
没错,谢谢你的评论。我已经更新了我的解决方案并添加了描述。 - muinh
这将返回一个带有整数键的数组,这就是需要解决的问题。 - Walf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接