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; }