Как преобразовать массив массивов или объектов в ассоциативный массив?

Я привык к функции 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, чтобы получить список только тех полей ввода, которые соответствуют заданным критериям. Это может быть полезно, например, если у вас в форме много полей ввода, но определенная группа из них должна обрабатываться вместе.

В этом случае у меня есть несколько полей ввода, которые представляют сопоставления с базой данных. Каждое из полей ввода выглядит так: где каждое поле этого типа имеет префикс «поле -».

то, что мы хотим сделать, это, во-первых, получить список только тех полей ввода, которые на самом деле начинаются с «поля -», затем мы хотим создать ассоциативный массив с именем $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 и для каждого ключа проверяет, есть ли у него префикс, и если да, помещает его и его значение в массив)

15
задан Tom Auger 20 March 2014 в 19:35
поделиться