php 我如何使用array_map与键和值,但返回一个具有相同索引(而不是int)的数组?

ctehm74n  于 2023-06-28  发布在  PHP
关注(0)|答案(6)|浏览(148)

我有一个数组,比如['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。

kcrjzv8t

kcrjzv8t1#

对于“我想调用array_map”和“$result与$arr相同”的要求,请尝试:

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

提供:

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

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

$result = $arr;
pw9qyyiw

pw9qyyiw2#

使用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

ylamdve6

ylamdve63#

你需要的是array_walk()。试试这个代码:

$arr = array('id' => 1, 'name' => 'Fred');
array_walk(
    $arr,
    function (&$value, $key) {
        // do stuff
    }
);
print_r($arr);

不幸的是,它不能改变键,但是如果你的回调通过引用使用它们,你可以改变值。
如果你也必须改变密钥,请检查我关于reindexing with array_walk()的其他答案。

pgky5nke

pgky5nke4#

基于@Jannie泰尼森的答案,获得array_map的正确方法是使用key来比较和分配基于第二个数组的值,例如:

$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)
);
a8jjtwal

a8jjtwal5#

这个想法很简单。你需要在array_map()函数中使用键。
为此,我们添加两个数组:第一个array_keys($array)我们传递我们的主数组的键,第二个$array是所需的数组。

array_map(function($key, $value) {

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

    }, array_keys($array), $array)

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

egmofgnx

egmofgnx6#

我想这不是我想出来的,但我也不记得我从哪里得到的。
这个函数是通用的,具有与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) {作为回调签名,但它们仅限于一个输入数组,并且在接受多个输入数组时,将键放在值的中间没有意义。

相关问题