2011-12-16 22 views
7

Mam ciąg:String ze strukturą tablicy do tablicy

Main.Sub.SubOfSub 

i pewnego rodzaju danych, może być ciągiem:

SuperData 

Jak mogę przekształcić je wszystkie do tej tablicy powyżej?

Array 
(
[Main] => Array 
    (
     [Sub] => Array 
      (
       [SubOfSub] => SuperData 
      ) 

    ) 

)

Dzięki za pomoc, PK

+0

$ tmp_array = explode ('.', $ Your_string); Następnie wykonaj iterację $ tmp_array i utwórz tablicę $ k – djot

+0

Zobacz http://php.net/manual/en/function.explode.php i http://php.net/manual/en/function.implode .php i jesteś prawie w domu. – Cyclonecode

+0

Podobne pytanie, tylko dla obiektu 'stdClass', a nie tablicy: [Array to object] (http://stackoverflow.com/q/11188563/367456). – hakre

Odpowiedz

11

Biorąc pod uwagę wartości

$key = "Main.Sub.SubOfSub"; 
$target = array(); 
$value = "SuperData"; 

Oto niektóre kodu mam leżące wokół, że ma co need¹:

$path = explode('.', $key); 
$root = &$target; 

while(count($path) > 1) { 
    $branch = array_shift($path); 
    if (!isset($root[$branch])) { 
     $root[$branch] = array(); 
    } 

    $root = &$root[$branch]; 
} 

$root[$path[0]] = $value; 

See it in action.

¹ W rzeczywistości robi to nieco więcej: można go w prosty sposób zamknąć wewnątrz funkcji i można go konfigurować na wszystkich trzech wartościach wejściowych (można przekazać tablicę z istniejącymi wartościami i w razie potrzeby rozszerzyć ją) .

4

Tak jak zasugerował Jon (i pyta o opinie na czacie), alias referencyjny/zmienny jest pomocny w przejściu przez stos dynamicznych kluczy. Jedyne więc potrzebna jest iteracyjne nad wszystkie podklucze i ostatecznie ustawić wartość:

$rv = &$target; 
foreach(explode('.', $key) as $pk) 
{ 
    $rv = &$rv[$pk]; 
} 
$rv = $value; 
unset($rv); 

Odniesienie umożliwia użycie stosu zamiast rekurencji, która jest na ogół bardziej chude. Ponadto ten kod zapobiega zastępowaniu istniejących elementów w tablicy $target. Pełny przykład:

$key = "Main.Sub.SubOfSub"; 
$target = array('Main' => array('Sub2' => 'Test')); 
$value = "SuperData"; 

$rv = &$target; 
foreach(explode('.', $key) as $pk) 
{ 
    $rv = &$rv[$pk]; 
} 
$rv = $value; 
unset($rv); 

var_dump($target); 

wyjściowa:

array(1) { 
    ["Main"]=> 
    array(2) { 
    ["Sub2"]=> 
    string(4) "Test" 
    ["Sub"]=> 
    array(1) { 
     ["SubOfSub"]=> 
     string(9) "SuperData" 
    } 
    } 
} 

Demo

pokrewne Pytanie (a):

Powiązane problemy