2011-11-24 30 views
6

w odniesieniu do tej kwestii poprosiłem wcześniej: Searching multi-dimensional array's keys using a another arrayUstawienie wartości w wielowymiarowej tablicy przy użyciu tablicy kluczy

Chciałbym sposób ustawić wartość w wielowymiarowej tablicy (do 6 poziomów głębokości), używając osobnej tablicy zawierającej klawisze do użycia.

np.

$keys = Array ('A', 'A2', 'A22', 'A221'); 
$cats[A][A2][A22][A221] = $val; 

Próbowałem napisać niezgrabny przełącznik z małym sukcesem ... czy istnieje lepsze rozwiązanie?

function set_catid(&$cats, $keys, $val) { 
    switch (count($keys)) { 
     case 1: $cats[$keys[0]]=$val; break; 
     case 2: $cats[$keys[0]][$keys[1]]=$val; break; 
     case 3: $cats[$keys[0]][$keys[1]][$keys[2]]=$val; break; 
     etc... 
    } 
} 
+0

Mogłabyś [referencje użytkowania] (http://stackoverflow.com/questions/6088115/transform-flat-array-into-a-hierarchical-multi-dimensional -array/6088147 # 6088147) do przechodzenia przez tablicę za pomocą dowolnej liczby kluczy. – mario

Odpowiedz

1

spróbuj tego:

function set_catid(&$cats, $keys, $val) { 
    $ref =& $cats; 
    foreach ($keys as $key) { 
    if (!is_array($ref[$key])) { 
     $ref[$key] = array(); 
    } 
    $ref =& $ref[$key]; 
    } 
    $ref = $val; 
} 
+0

Działa to świetnie, chyba że ostatni klucz nie istnieje, co w moim przypadku nie będzie. pojawia się błąd "Błąd krytyczny: nie można utworzyć odniesień do/z przesunięć ciągów ani przeciążonych obiektów" na $ ref = & $ ref [$ key]; jak mógłbym rozwiązać ten problem? –

+0

Dziwne. to działa dobrze dla mnie. (zaczynając od całkowicie pustej tablicy $ cats). Musi być, ponieważ "A22" (klucz przed ostatnim kluczem) istnieje jako coś innego, co nie jest tablicą. na przykład strunowy? w takim przypadku zastąpienie isset() przez is_array() pomoże - ale utracisz ciąg znaków w "A22", zastępując go inną tablicą. Czy możesz użyć wyjścia print_r ($ cats) przed użyciem tej funkcji? – Kaii

+0

Zrobiłem zmianę, którą zasugerowałem w przykładzie, spróbuj ponownie – Kaii

1
function insertValueByPath($array, $path, $value) { 
    $current = &$array; 
    foreach (explode('/', $path) as $part) { 
     $current = &$current[$part]; 
    } 
    $current = $value; 

    return $array; 
} 

$array = insertValueByPath($array, 'A/B/C', 'D'); 
// => $array['A']['B']['C'] = 'D'; 

Można oczywiście również używać tablicy dla $path tylko przez upuszczenie połączenia explode.

0

Powinieneś używać referencji.

W foreach poruszamy się głębiej od klucza do klucza. Var $ temp jest odniesieniem do bieżącego elementu tablicy $ cat. W końcowej temp jest elementem, który potrzebujemy.

<?php 

    function set_catid(&$cats, $keys, $val) { 
     $temp = &$cats; 
     foreach($keys as $key) { 
      $temp = &$temp[$key]; 
     } 

     $temp = $val; 
    } 

    $cats = array(); 
    $keys = Array ('A', 'A2', 'A22', 'A221'); 
    set_catid($cats, $keys, 'test'); 
    print_r($cats); 
    ?> 
+0

To działa świetnie, chyba że klucz końcowy nie istnieje, co w moim przypadku nie będzie. więc muszę dodać nową parę kluczy i wartości. jak mógłbym to zrobić? –

Powiązane problemy