Sono abituato alla funzione map() di perl, in cui il callback può assegnare sia la chiave che il valore, creando così un array associativo in cui l'input era un array piatto. Sono a conoscenza di array_fill_keys()
che può essere utile se tutto ciò che si vuole fare è creare un hash in stile dizionario, ma cosa succede se non si desidera necessariamente che tutti i valori siano uguali? Ovviamente tutte le cose possono essere fatte con foreach iteration, ma quali altri (possibilmente più eleganti) metodi esistono?Come convertire un array di matrici o oggetti in un array associativo?
Modifica: aggiunta di un esempio per chiarire la trasformazione. Per favore non rimanere impigliato nella trasformazione, la domanda è trasformare una lista piatta in un hash in cui non possiamo assumere che tutti i valori saranno gli stessi.
$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
mondo reale Esempio Quindi, utilizzando una risposta che è stata fornita qui, ecco come si potrebbe analizzare attraverso il $ _POST per ottenere un elenco di quei campi di input che corrispondono a un dato criterio. Ciò potrebbe essere utile, ad esempio, se nel modulo sono presenti molti campi di input, ma un determinato gruppo di essi deve essere elaborato insieme.
In questo caso, ho un numero di campi di input che rappresentano i mapping a un database. Ognuno dei campi di input è simile al seguente: <input name="field-user_email" value="2" />
dove ognuno di questo tipo di campo è preceduto da "campo-".
quello che vogliamo fare è, in primo luogo, ottenere un elenco solo di quei campi di input che effettivamente iniziano con "field-", quindi vogliamo creare un array associativo chiamato $mapped_fields
che ha il nome del campo estratto come chiave e il valore del campo di input effettivo come valore.
$mapped_fields = array_reduce(preg_grep('/field-.+/', array_keys($_POST)), function($hash, $field){ $hash[substr($field, 6)] = $_POST[$field]; return $hash; });
quali uscite:
Array ([date_of_birth] => 1 [user_email] => 2 [last_name] => 3 [first_name] => 4 [current_position] => 6)
(Così, tanto per anticipare gli oppositori, mi permetta d'accordo che questo pezzo di codice compatto è probabilmente molto meno leggibile che un semplice ciclo che consente di scorrere $ _POST e, per ogni chiave, controlla se ha il prefisso e, in caso affermativo, lo apre e il suo valore su un array)
Puoi pubblicare un dump dell'array (usando 'print_r' o' var_dump')? – Florent
@Florent done ... –