2011-09-22 15 views
6

mam ciąg jak poniżej:dynamiczne klucze tablicy

$string = 'one/two/three/four';

które przekształcić go w tablicy:

$keys = explode('/', $string);

Ta tablica może mieć dowolną liczbę elementów, jak 1 , 2, 5 itd.

Jak mogę przypisać pewną wartość do tablicy wielowymiarowej, ale użyć $keys stworzyłem ab ove, aby określić miejsce, w którym chcesz wstawić?

odczuwalna:

$arr['one']['two']['three']['four'] = 'value';

Przepraszam, jeśli pytanie jest mylące, ale nie wiem, jak to wytłumaczyć, że lepiej

Odpowiedz

13

Jest to rodzaj nietrywialne, ponieważ chcesz gnieździe, ale powinno być coś takiego:

function insert_using_keys($arr, $keys, $value){ 
    // we're modifying a copy of $arr, but here 
    // we obtain a reference to it. we move the 
    // reference in order to set the values. 
    $a = &$arr; 

    while(count($keys) > 0){ 
     // get next first key 
     $k = array_shift($keys); 

     // if $a isn't an array already, make it one 
     if(!is_array($a)){ 
      $a = array(); 
     } 

     // move the reference deeper 
     $a = &$a[$k]; 
    } 
    $a = $value; 

    // return a copy of $arr with the value set 
    return $arr; 
} 
1

Najpierw musisz upewnić się, że klucz istnieje, a następnie przypisać wartość. Coś jak to powinno działać (niesprawdzone):

function addValueByNestedKey(&$array, $keys, $value) { 
    $branch = &$array; 
    $key = array_shift($keys); 
    // add keys, maintaining reference to latest branch: 
    while(count($keys)) { 
     $key = array_pop($keys); 
     if(!array_key_exists($key, $branch) { 
      $branch[$key] = array(); 
     } 
     $branch = &$branch[$key]; 
    } 
    $branch[$key] = $value; 
} 

// usage: 
$arr = array(); 
$keys = explode('/', 'one/two/three/four'); 

addValueByNestedKey($arr, $keys, 'value'); 
1

to banalnie, ale:

function setValueByArrayKeys($array_keys, &$multi, $value) { 
    $m = &$multi 
    foreach ($array_keys as $k){ 
     $m = &$m[$k]; 
    } 
    $m = $value; 
} 
+0

To nie zadziała. '$ multi = $ multi [$ k]' tworzy * kopię *, to nie jest odniesienie, więc nie modyfikujesz niczego, gdy robisz '$ multi = $ value', z wyjątkiem ostatniej tablicy. –

+0

właśnie to edytowałem. – MattoTodd

+0

* nadal * nie działa, tworzysz * kopie *, a nie * odniesienia *. –

5
$string = 'one/two/three/four'; 
$keys = explode('/', $string); 
$arr = array(); // some big array with lots of dimensions 
$ref = &$arr; 

while ($key = array_shift($keys)) { 
    $ref = &$ref[$key]; 
} 

$ref = 'value'; 

Co to robi:

  • Korzystanie zmiennej $ref, aby śledzić odniesienia do obecnego wymiaru $arr.
  • Zapętlanie się przez $keys pojedynczo, odwołując się do elementu bieżącego odniesienia z elementu $key.
  • Ustawienie wartości do ostatecznego odniesienia.
+0

Gdy próbuję tego, otrzymuję "połączenie zamknięte przez serwer" :) – Alex

+0

ok teraz działa: D – Alex

+0

Co jeśli '$ keys' zawiera 0 lub NULL? –

Powiązane problemy