2013-04-12 10 views
25

mam to:

$strVar = "key value"; 

I chcę, aby go w ten sposób:

array('key'=>'value') 

Próbowałem go eksplodować(), ale że daje mi to:

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

Oryginalny $ strVar jest już wynikiem rozłożeniu łańcucha, a ja zapętlenie nad wszystkimi wartościami otrzymanej tablicy.

+0

Dlaczego nie można po prostu utworzyć tablicę z tych 'explode()' rezultatów? – Sirko

+0

, a następnie wykonaj '$ myArray [$ ar [0]] = $ ar [1];' gdzie '$ ar' jest rozbitym łańcuchem. – Jon

Odpowiedz

37

Nie wierzę, że to możliwe w jednej operacji, ale powinno to wystarczyć:

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

Dzięki temu bardziej efektywne wykorzystanie pamięci. PORADA: Kiedy 'foreach' używa tej rekursywnej, tworząc dużą tablicę, możesz' unset() 'oryginalną/źródłową tablicę po wypełnieniu' $ result'. Spowoduje to przycięcie pamięci. Tj., Parsując kategorie zakupów Google z ich pliku [crappy] txt, tablica temp jest tworzona za pomocą 'file()', a następnie 'explode()' na każdym wierszu, aby wyizolować ID jako klucz. Tablica źródłowa ma 5425 wierszy zawierających ciągi. Ta tablica ma ~ 1mb, a jej tymczasowy, nuke to :) – dhaupin

+1

Jak wartości są przechowywane w '$ result'? –

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

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

Edit: Mój błąd, używane podzielone zamiast wybuchnąć ale:

podzielonym function() został DEPRECATED od PHP 5.3.0. Opierając się na tej cechą jest bardzo zniechęcony

3

Można pętli każdy drugi ciąg:

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

Spróbuj

$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]; 
} 

Ale wydaje się oczywiste, jeśli wydaje się, że znasz tablice i explode. Więc mogą istnieć pewne ograniczenia, których nam nie dałeś. Możesz zaktualizować swoje pytanie, aby wyjaśnić.

+1

Nie, nie ma ograniczeń, szukałem tylko rozwiązania "jednej linii kodu" :-) – Borniet

-1

Pojedyncza linia dla ciebie:

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

Jeśli osoba, która głosuje, mogłaby wyjaśnić powody, dla których można głosować w dół, być może moglibyśmy się czegoś nauczyć ... – nzn

+0

Nie moje zdanie , ale jest to odpowiedź typu "tylko kod", a tego rodzaju odpowiedzi w bardzo niewielkim stopniu służą kształceniu przyszłych czytelników. Jeśli chcesz zdobyć punkty rep, popraw odpowiedź, aby zawierała wyjaśnienie, dlaczego jest to odpowiednia metoda i jak działa. (Wiem jak to działa BTW) – mickmackusa

0

Kolejna linia pojedyncza:

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

Jeśli masz więcej niż 2 słowa w swoim ciąg, należy użyć następującego kodu.

$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); 

$array trzyma dziwnie umieszczone słowo key i równomiernie rozmieszczone słowa $value odpowiednio.

-2

znalazłem inny łatwy sposób, aby to zrobić:

$ a = array_flip (explode (””, $ strVal));

+0

To da ci 'tablicę (klucz => 0, wartość => 1)'. OP chce 'tablica (klucz => wartość)'. –

1

Można spróbować to:

$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; 
     } 
    } 
} 

wiem, wydaje się skomplikowany, ale to działa;)

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]; 
} 

Wyjścia tablica

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

Witamy w SO. Czy możesz wyjaśnić, dlaczego uważasz, że jest to właściwa odpowiedź? –

+0

Ta odpowiedź jest poprawna i lepiej być używana z 'foreach()' – sobhan

+0

Bardzo pomocne, dzięki! – vipin

0

Jeśli masz długą listę klucza -parowe pary rozdzielone przez ten sam znak, który również ogranicza klucz i wartość, ta funkcja wykonuje lewę.

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; 
} 

Przykład:

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

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

Dodaj opis, aby wyjaśnić odpowiedź, aby skorzystać z innych. – jjj

+0

Nie zapewnia to odpowiedzi na pytanie. Gdy masz już wystarczającą [reputację] (https://stackoverflow.com/help/whats-reputation), będziesz mógł [komentować dowolny wpis] (https://stackoverflow.com/help/privileges/comment); zamiast tego [dostarczaj odpowiedzi, które nie wymagają wyjaśnień od pytającego] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-zamiast). - [Z recenzji] (/ opinia/niskiej jakości-posts/18543968) – Ele