PHP的:我可以得到一个array_map函数的索引?

我在php中使用的地图如下所示:

function func($v) { return $v * 2; } $values = array(4, 6, 3); $mapped = array_map(func, $values); var_dump($mapped); 

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

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

当然你可以在array_keys():的帮助下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( function($val) use ($foo) { /* ... */ }, array(key1 => val1, key2 => val2, /* ... */)); 

array_reduce也不能访问键。 array_walk可以访问键,但数组是通过引用传递的,这需要一个间接层。

一些解决scheme是:

数组对

这是不好的,因为我们正在改变原来的数组。 另外样板“array()”调用随着数组长度线性增加:

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

临时variables

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

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

一次性function

我们可以使用函数作用域来防止破坏现有名称,但是必须添加一个额外的“使用”层:

 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, /* ... */)); 

新function

有趣的是,我们最后的一次函数有一个很好的通用签名,看起来很像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, /* ... */)); 

间接arrays走

在编写上面的代码时,我忽略了array_walk,因为它需要通过引用传递它的参数; 不过,我已经意识到使用call_user_func解决这个问题很容易。 我认为这是迄今为止最好的版本:

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

您在Dropdown类中缺less参数。 我认为这样更好:

 public function options() { $value = $this->value; $mapped = array_map(function($k, $v) use ($value) { return array( 'value' => $k, 'display' => $v, 'selected' => ($value === $k), ); }, array_keys($this->options), $this->options); return $mapped; }