2009-09-11 9 views
5

Dire che ho una serie di coppie chiave/valore in PHP:come combinare le chiavi ed i valori di un array in PHP

array('foo' => 'bar', 'baz' => 'qux'); 

Qual è il modo più semplice per trasformare questo in una matrice che appare come il seguente ?

array('foo=bar', 'baz=qux'); 

cioè

array(0 => 'foo=bar', 1 => 'baz=qux'); 

in Perl, mi piacerebbe fare qualcosa di simile a

map { "$_=$hash{$_}" } keys %hash 

C'è qualcosa di simile nel panoply of array functions in PHP? Nulla di ciò che guardavo sembrava una soluzione conveniente.

risposta

9
function parameterize_array($array) { 
    $out = array(); 
    foreach($array as $key => $value) 
     $out[] = "$key=$value"; 
    return $out; 
} 
+0

Accetto questa risposta perché è semplice, e come ho finito per risolvere il mio problema. Sono deluso che non ci sia modo di farlo in una singola espressione, evitando la necessità della variabile temporanea $ out. – nohat

+3

Se sei un utente Perl, questa sarà solo una delle tante, molte delusioni che incontrerai nel corso della tua esperienza con PHP. – chaos

+0

@chaos Sì, la vita è dura e il php è leggibile. @nohat Sebbene questo non "trasformi" l'array come richiesto dalla tua domanda. Ne crea uno nuovo. "Panoplia delle funzioni di matrice"? Ridacchiare. – GZipp

0

La risposta del caos è semplice e lineare. Per un significato più generale, però, potresti aver perso la funzione array_map() che è ciò che hai accennato con l'esempio map { "$_=$hash{$_}" } keys %hash.

+0

array_map(), a quanto pare, fornisce solo i valori dell'array – nohat

+0

Sfortunatamente, il codice equivalente rigoroso in PHP sotto 5.3 è un 'create_function()' -usando un abominio. – chaos

+0

Ah, nohat, se avete bisogno delle chiavi, potreste essere in grado di usare 'array_walk()' (anche se questo modifica l'array sul posto invece di restituire un nuovo array). – Amber

3

Un modo "curioso" per farlo = P

// using '::' as a temporary separator, could be anything provided 
// it doesn't exist elsewhere in the array 
$test = split('::', urldecode(http_build_query($test, '', '::'))); 
+0

Ho trovato la stessa soluzione, ma sono "curioso")) sul processo di codifica/decodifica se è monosemantico. Ho provato ad usarlo per una rapida disposizione delle condizioni di query in ORM, ma per qualche motivo dubito della sicurezza dei dati quando urlencode/urldecode. –

13

Un'altra opzione per questo problema: su PHP 5.3+ è possibile utilizzare array_map() con una chiusura (si può fare questo con PHP precedenti 5.2, ma la il codice diventerà piuttosto disordinato!).

"Oh, ma su array_map() si ottiene solo il valore!".

Sì, è vero, ma possiamo mappare più di un array! :)

$arr = array('foo' => 'bar', 'baz' => 'qux'); 
$result = array_map(function($k, $v){ 
    return "$k=$v"; 
}, array_keys($arr), array_values($arr)); 
Problemi correlati