Jestem przyzwyczajony do funkcji perl's map(), w której callback może przypisać zarówno klucz, jak i wartość, tworząc w ten sposób tablicę asocjacyjną, w której wejście było płaską tablicą. Jestem świadomy array_fill_keys()
, który może być przydatny, jeśli chcesz tylko utworzyć mieszanie stylu słownikowego, ale co jeśli nie wszystkie wartości będą takie same? Oczywiście wszystko można zrobić z iteracją foreach, ale jakie inne (być może bardziej eleganckie) metody istnieją?Jak przekonwertować tablicę tablic lub obiektów na tablicę asocjacyjną?
Edytuj: dodając przykład, aby wyjaśnić transformację. Proszę nie zwlekać z transformacją, chodzi o przekształcenie płaskiej listy w skrót, w którym nie możemy założyć, że wszystkie wartości będą takie same.
$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
rzeczywistym świecie Przykład Więc korzystając odpowiedź dostarczonego tutaj, oto jak można analizować poprzez $ _POST, aby uzyskać listę tylko tych pól wejściowych pasujących do danego kryteria. Może to być przydatne, na przykład, jeśli masz wiele pól wejściowych w formularzu, ale pewna grupa z nich musi być przetwarzana razem.
W tym przypadku mam wiele pól wejściowych reprezentujących odwzorowania do bazy danych. Każde z pól wejściowych wygląda następująco: <input name="field-user_email" value="2" />
, gdzie każde pole tego typu jest poprzedzone prefiksem "pole-".
chcemy najpierw uzyskać listę tylko tych pól wejściowych, które faktycznie zaczynają się od "field-", następnie chcemy utworzyć tablicę asocjacyjną o nazwie $mapped_fields
, która ma wyodrębnioną nazwę pola jako klucz i faktyczna wartość pola wejściowego jako wartość.
$mapped_fields = array_reduce(preg_grep('/field-.+/', array_keys($_POST)), function($hash, $field){ $hash[substr($field, 6)] = $_POST[$field]; return $hash; });
które wyjścia:
Array ([date_of_birth] => 1 [user_email] => 2 [last_name] => 3 [first_name] => 4 [current_position] => 6)
(Tak, tak, aby zapobiec naysayers, pozwól mi zgodzić się, że ten kawałek kodu kompaktowej jest zapewne o wiele mniej czytelny, że prosta pętla że iteracje przez $ _POST i, dla każdego klucza, sprawdza, czy ma on prefiks, a jeśli tak, wyrzuca go i jego wartość na tablicę)
Czy możesz wysłać zrzut tablicy (używając 'print_r' lub' var_dump')? – Florent
@Florent done ... –