我习惯于perl的map()函数,其中回调可以分配键和值,从而创建一个关联数组,其中输入是一个平面数组.我知道
array_fill_keys()
这可以是有用的,如果你想要做的是创建一个字典风格的哈希,但如果你不一定要所有的值都一样?显然所有的事情都可以用foreach迭代来完成,但还有什么其他的(可能更优雅的)方法呢?
编辑:添加一个例子来澄清转换.请不要挂断转换,问题是将平面列表转换为哈希,我们不能假设所有的值都是相同的.
$original_array: ('a','b','c','d') $new_hash: ('a'=>'yes','b'=>'no','c'=>'yes','d'=>'no') *note: the values in this example are arbitrary,governed by some business logic that is not really relevant to this question. For example,perhaps it's based on the even-oddness of the ordinal value of the key
现实世界的例子
所以,使用这里提供的答案,这里是如何通过$_POST来解析只获得符合给定条件的输入字段的列表.这可能是有用的,例如,如果您的表单中有很多输入字段,但必须一起处理其中一组.
在这种情况下,我有一些表示与数据库的映射的输入字段.每个输入字段如下所示:
< input name =“field-user_email”value =“2”/>其中每种类型的字段都以“field-”为前缀.
我们想要做的是首先得到一个仅以“field-”开头的输入字段的列表,然后我们要创建一个名为$mapped_fields的关联数组,其中提取的字段名称作为关键字,实际输入字段的值作为值.
$mapped_fields = array_reduce( preg_grep( '/field-.+/',array_keys( $_POST ) ),function( $hash,$field ){ $hash[substr( $field,6 )] = $_POST[$field]; return $hash; } );
哪些输出:
Array ( [date_of_birth] => 1 [user_email] => 2 [last_name] => 3 [first_name] => 4 [current_position] => 6 )
(所以,只是为了防止naysayers,让我同意这一点紧凑的代码可以说是一个很少的可读性,一个循环遍历$_POST的简单循环,对于每个键,检查它是否有前缀,如果所以,将它和它的值弹出到一个数组)
前几天我有完全相同的问题.这是不可能使用array_map,但
array_reduce
做的伎俩.
$arr = array('a','d'); $assoc_arr = array_reduce($arr,function ($result,$item) { $result[$item] = (($item == 'a') || ($item == 'c')) ? 'yes' : 'no'; return $result; },array()); var_dump($assoc_arr);
结果:
array(4){[“a”] => string(3)“yes”[“b”] => string(2)“no”[“c”] => string(3)“yes”[“d”] => string(2)“no”}