当前位置:  开发笔记 > 编程语言 > 正文

PHP:我可以在array_map函数中获取索引吗?

如何解决《PHP:我可以在array_map函数中获取索引吗?》经验,为你挑选了2个好方法。

我在php中使用地图如下:

function func($v) {
    return $v * 2;
}

$values = array(4, 6, 3);
$mapped = array_map(func, $values);
var_dump($mapped);

是否有可能获得函数中值的索引?

另外 - 如果我正在编写需要索引的代码,我应该使用for循环而不是map吗?



1> Aron Rotteve..:

当然,你可以在...的帮助下 array_keys():

function func($v, $k) {
    // key is now $k
    return $v * 2;
}

$values = array(4, 6, 3);
$mapped = array_map(func, $values, array_keys($values));
var_dump($mapped);


很酷的回答,没有意识到你可以将额外的参数传递给array_map()ped方法.每天学些新东西!
这是一种非常冒险的方法,因为PHP不保证`array_keys`返回的键将保持与原始数组中的顺序相同.因此,您可能最终将键映射到错误的值.安全的方法是只使用`array_keys`作为`array_map`的第二个参数,然后使用`use`语句将数组传递给closure.
我坦率地不明白为什么PHP没有map函数提供每个元素的键作为回调的第二个参数.

2> Warbo..:

在匿名数组上映射匿名函数时,无法访问密钥:

array_map(
    function($val) use ($foo) { /* ... */ },
    array(key1 => val1,
          key2 => val2,
          /* ... */));

array_reduce也无法访问密钥.array_walk可以访问键,但是数组是通过引用传递的,这需要一层间接.

一些解决方案是:

对数组

这很糟糕,因为我们正在更改原始数组.此外,样板"array()"调用随着数组的长度线性增加:

array_map(
    function($pair) use ($foo) {
        list($key, $val) = $pair;
        /* ... */
    },
    array(array(key1, val1),
          array(key2, val2),
          /* ... */));

临时变量

我们正在对原始数组进行操作,并且样板文件是常量,但我们可以轻松地破坏现有变量:

$i_hope_this_does_not_conflict = array(key1 => val1,
                                       key2 => val2,
                                       /* ... */);
array_map(
    function($key, $val) use ($foo) { /* ... */ },
    array_keys($i_hope_this_does_not_conflict),
    $i_hope_this_does_not_conflict);
unset($i_hope_this_does_not_conflict);

一次性功能

我们可以使用函数范围来防止破坏现有名称,但必须添加额外的"使用"层:

call_user_func(
    function($arr) use ($foo) {
        return array_map(function($key, $val) use ($foo) { /* ... */ },
                         array_keys($arr),
                         $arr);
    },
    array(key1 => val1,
          key2 => val2,
          /* ... */));

多参数一次性功能

我们定义了我们在原始范围内映射的函数,以防止"使用"样板:

call_user_func(
    function($f, $arr) {
        return array_map($f, array_keys($arr), $arr);
    },
    function($key, $val) use ($foo) { /* ... */ },
    array(key1 => val1,
          key2 => val2,
          /* ... */));

新功能

有趣的是要注意的是,我们的最后一次性功能有一个很好的通用签名,看起来很像array_map.我们可能想给它一个名字并重复使用它:

function array_mapk($f, $arr) {
    return array_map($f, array_keys($arr), $arr);
}

我们的应用程序代码变为:

array_mapk(
    function($key, $val) use ($foo) { /* ... */ },
    array(key1 => val1,
          key2 => val2,
          /* ... */));

间接阵列行走

写上面的时候我忽略了array_walk,因为它要求它的参数通过引用传递; 但是,我已经意识到使用call_user_func很容易解决这个问题.我认为这是目前为止最好的版本:

call_user_func(
    'array_walk',
    array(key1 => val1,
          key2 => val2,
          /* ... */),
    function($val, $key) use ($foo) { /* ... */ });

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有