私は、コールバックがキーと値の両方を割り当てることができる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を繰り返し処理し、キーごとにプレフィックスがあるかどうかを確認する単純なループよりも、おそらくはるかに読みにくいことに同意します。したがって、それとその値を配列にポップします)