2011-06-20 12 views
5

Jeśli mam tablicę, która odpowiada kolejnym kluczom rekurencyjnym w innej tablicy, jaki jest najlepszy sposób przypisania wartości do tej "ścieżki" (jeśli chcesz to tak nazwać)?Przypisywanie do arbitralnie głębokiego indeksu tablicy?

Na przykład:

$some_array = array(); 
$path = array('a','b','c'); 
set_value($some_array,$path,'some value'); 

Teraz, $some_array powinna wynosić

array(
    'a' => array(
    'b' => array(
     'c' => 'some value' 
))) 

w tej chwili używam następujące:

function set_value(&$dest,$path,$value) { 
    $addr = "\$dest['" . implode("']['", $path) . "']"; 
    eval("$addr = \$value;"); 
} 

Oczywiście, to jest bardzo naiwny podejście i stanowi ryzyko bezpieczeństwa, więc jak by to zrobić?

+1

Co się stanie, jeśli ścieżka jest nieważna? – Matthew

+0

@konforce - Powinno to być przypisane tak, jak w moim przykładzie powyżej, gdy '$ some_example' zaczyna być pusta. –

+0

Zaktualizowałem moją odpowiedź, aby to odzwierciedlić. Zauważ, że teraz również nadpisuje wartości łańcuchów tablicami, ale byłoby to łatwe do zmiany, gdyby to zachowanie nie było pożądane. – Matthew

Odpowiedz

2

rozwiązanie rekurencyjne (nie testowane):

function set_value(&$dest,$path,$value) { 
     $index=array_shift($path); 
     if(empty($path)){ 
     // on last level 
     $dest[$index]=$value; 
     } 
     else{ 
     // descending to next level 
     set_value($dest[$index],$path,$value); 
     } 
    } 
2

Wow, przypomina mi Lisp.

Tak, eval ogólnie nie jest najlepszym pomysłem.

Osobiście po prostu iteracyjne:

function set_value(&$dest,$path,$value) { 
    $val =& $dest; 
    for($i = 0; $i > count($path) - 1; $i++) { 
    $val =& $val[$i]; 
    } 

    $val[$path[$i]] = $value; 
} 

Jeśli jesteś w PHP 5 prawdopodobnie można dostać rd niektórych z tych „&” zbyt

+1

Masz na myśli '$ val [$ path [$ i]]' gdzie masz '$ val [$ i]'? – Matthew

+0

Oh! Całkiem poprawnie. Naprawiłem to. Dziękuję Ci. – cwallenpoole

2
function set_value(&$dest, $path, $value) 
{ 
    # allow for string paths of a/b/c 
    if (!is_array($path)) $path = explode('/', $path); 

    $a = &$dest; 
    foreach ($path as $p) 
    { 
    if (!is_array($a)) $a = array(); 
    $a = &$a[$p]; 
    } 

    return $a = $value; 
} 


set_value($a, 'a/b/c', 'foo'); 

zaktualizowany do pracy z kluczami które jeszcze nie istnieją i zaakceptować tablicę lub ścieżkę łańcuchową.

2
function set_value(&$dest, $path, $value) { 
    $dest = array(array_pop($path) => $value); 
    for($i = count($path) - 1; $i >= 0; $i--) { 
     $dest = array($path[$i] => $dest); 
    } 
} 
Powiązane problemy