我习惯于 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 )
(所以,为了阻止反对者,让我同意这一点紧凑的代码的可读性可能比一个简单的循环遍历 $_POST 并检查它是否有前缀,如果所以,将它和它的值弹出到一个数组中)