2013-04-12 12 views
25

ho questo:

$strVar = "key value"; 

e voglio farlo in questo:

array('key'=>'value') 

ho provato con explode(), ma che mi dà questo:

array('0' => 'key', 
     '1' => 'value') 

il $ strVar originale è già il risultato di una stringa esploso, e sto loop su tutti i valori della matrice risultante.

+0

Perché non basta creare l'array fuori dai explode() '' risultati? – Sirko

+0

e poi esegui '$ myArray [$ ar [0]] = $ ar [1];' dove '$ ar' è la stringa esplosa. – Jon

risposta

37

Non credo che questo è possibile in una sola operazione, ma questo dovrebbe fare il trucco:

list($k, $v) = explode(' ', $strVal); 
$result[ $k ] = $v; 
+0

Grazie, in questo modo è più efficiente l'uso di mem. SUGGERIMENTO: Quando 'foreach' sta usando questo ricorsivo facendo un array di grandi dimensioni, è possibile' unset() 'l'array originale/sorgente dopo che '$ result' è popolato. Questo taglierà la memoria. Vale a dire, quando si analizzano le categorie dello shopping di Google dal loro file [crappy] txt viene creato un array temporaneo usando 'file()' e poi 'explode()' su ogni stringa di riga per isolare un ID come chiave. L'array di origine ha 5425 righe contenenti stringhe. Quell'array è ~ 1mb, e il suo valore temporaneo, nuke it :) – dhaupin

+1

Come vengono memorizzati i valori in '$ result'? –

4
$strVar = "key value"; 
list($key, $val) = explode(' ', $strVar); 

$arr= array($key => $val); 

Edit: Il mio errore, utilizzato scissione invece di esplodere, ma: la funzione

split() è stato dichiarato obsoleto a partire dal PHP 5.3.0. Basandosi su questa caratteristica è altamente sconsigliato

3

È possibile ciclo ogni seconda stringa:

$how_many = count($array); 
for($i = 0; $i <= $how_many; $i = $i + 2){ 
    $key = $array[$i]; 
    $value = $array[$i+1]; 
    // store it here 
} 
2

Prova questo

$str = explode(" ","key value"); 
$arr[$str[0]] = $str[1]; 
2
$pairs = explode(...); 
$array = array(); 
foreach ($pair in $pairs) 
{ 
    $temp = explode(" ", $pair); 
    $array[$temp[0]] = $temp[1]; 
} 

Ma sembra ovvio che ti sembra di conoscere gli array e explode. Quindi potrebbero esserci dei vincoli che non ci hai dato. Potresti aggiornare la tua domanda per spiegare.

+1

No, nessun vincolo, stavo solo cercando una soluzione 'single line of code' :-) – Borniet

-1

linea singola per ya:

$arr = array(strtok($strVar, " ") => strtok(" ")); 
+0

Se il down-voter potesse compiacere la sua ragione per down-voting forse potremmo imparare qualcosa ... – nzn

+0

Non è il mio downvote , ma questa è una risposta solo in codice e questi tipi di risposte fanno ben poco per educare i futuri lettori. Se vuoi guadagnare punti Rep, perfeziona la tua risposta per includere una spiegazione sul motivo per cui questo è un metodo appropriato e come funziona. (So ​​come funziona BTW) – mickmackusa

0

Un'altra sola riga:

parse_str(str_replace(' ', '=', $strVar), $array); 
0

Se si dispone di più di 2 parole nella stringa, utilizzare il seguente codice.

$values = explode(' ', $strVar); 

    $count = count($values); 
    $array = []; 

    for ($i = 0; $i < $count/2; $i++) { 
     $in = $i * 2; 
     $array[$values[$in]] = $values[$in + 1]; 
    } 

    var_dump($array); 

Il $array stive stranamente posizionato parola key e uniformemente disposte rispettivamente parola $value.

-2

ho trovato un altro modo semplice per farlo:

$ a = array_flip (explode ('', $ strval));

+0

Questo ti darà 'array (chiave => 0, valore => 1)'. OP vuole 'array (chiave => valore)'. –

1

Si può provare questo:

$keys = array(); 
$values = array(); 

$str = "key value"; 
$arr = explode(" ",$str); 

foreach($arr as $flipper){ 
    if($flipper == "key"){ 
     $keys[] = $flipper; 
    }elseif($flipper == "value"){ 
     $values[] = $flipper; 
    } 
} 

$keys = array_flip($keys); 
// You can check arrays with 
//print_r($keys); 
//print_r($values); 

foreach($keys as $key => $keyIndex){ 
    foreach($values as $valueIndex => $value){ 
     if($valueIndex == $keyIndex){ 
      $myArray[$key] = $value; 
     } 
    } 
} 

Lo so, sembra complesso, ma funziona;)

3
$my_string = "key0:value0,key1:value1,key2:value2"; 

$convert_to_array = explode(',', $my_string); 

for($i=0; $i < count($convert_to_array); $i++){ 
    $key_value = explode(':', $convert_to_array [$i]); 
    $end_array[$key_value [0]] = $key_value [1]; 
} 

uscite gamma

$end_array(
      [key0] => value0, 
      [key1] => value1, 
      [key2] => value2 
      ) 
+0

Benvenuti in SO. Mi spieghi perché pensi che questa sia la risposta corretta? –

+0

Questa risposta è corretta e meglio usare con 'foreach()' – sobhan

+0

Molto utile, grazie! – vipin

0

Se si dispone lungo elenco di chiave -valori di coppie delimitati dallo stesso carattere che delimita anche la chiave e il valore, questa funzione fa il trucco.

function extractKeyValuePairs(string $string, string $delimiter = ' ') : array 
{ 
    $params = explode($delimiter, $string); 

    $pairs = []; 
    for ($i = 0; $i < count($params); $i++) { 
     $pairs[$params[$i]] = $params[++$i]; 
    } 

    return $pairs; 
} 

Esempio:

$pairs = extractKeyValuePairs('one foo two bar three baz'); 

[ 
    'one' => 'foo', 
    'two' => 'bar', 
    'three' => 'baz', 
] 
0
list($array["min"], $array["max"]) = explode(" ", "key value"); 
+2

Per favore aggiungi qualche descrizione per spiegare la risposta a beneficio dell'altro. – jjj

+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/18543968) – Ele

Problemi correlati