2013-06-04 11 views
5

Występuję dylemat, próbuję stworzyć funkcję "dynamicznie" przeszukiwania tablicy, w tym przypadku mojej tablicy sesji, ale powinna być dla każdej. Teraz to nie jest mój problem, mój problem jest dynamiczne pozwalają na to, aby to zrobić ...Dynamiczne przeszukiwanie przez tablicę

Oto co mam

public static function get($search = 'First/Second/Third') {  
    $explode = explode('/',$search); 
    $count = count($explode); 
    if ($count == 1) 
     if (isset($_SESSION[$explode[0]])) 
      return $_SESSION[$explode[0]]; 
    elseif ($count == 2) 
     if (isset($_SESSION[$explode[0]][$explode[1]])) 
      return $_SESSION[$explode[0]][$explode[1]]; 
    elseif ($count == 3) 
     if (isset($_SESSION[$explode[0]][$explode[1]][$explode[2]])) 
      return $_SESSION[$explode[0]][$explode[1]][$explode[2]]; 
} 

Więc powiedzmy, że mam tablicę:

array('First' => array('Second' => array('Third' => 'TEST VALUE')); 

teraz chcę zadzwonić

$value = get('First/Second/Third'); 

a następnie dostać „test Value” z powrotem jako wartość dla mojego zmiennej $ value.

W tej sytuacji to działa, ale to po prostu nie jest dynamiczny, a ja chcę, żeby być w stanie obsłużyć może nawet 10 warstw głębokie tablicę, a także, bez dodawania coraz więcej linii ....

Cóż, może tu ktoś mądrzejszy ode mnie :)

Dzięki!

Odpowiedz

6
$array = array(
     'First' => array(
       'Second' => array(
         'Third' => 'TEST VALUE' 
       ) 
     ) 
); 
echo get($array, 'First/Second/Third'); // TEST VALUE 

Funkcja Używane

function get($data, $part) { 
    foreach(explode("/", $part) as $key) { 
     $data = isset($data[$key]) ? $data[$key] : null; 
    } 
    return $data; 
} 

Live Demo

+0

To jest świetne rozwiązanie. Wstydzę się przyznać, że powróciłem do eval(), gdy miałem ten problem raz. – Andri

+0

Ale dlaczego '' $ data = isset ($ data [$ key])? $ data [$ key]: null'' zamiast tylko '' $ data = $ data [$ key] ''? Jeśli nie ma takiego klucza, '' $ data'' będzie mieć wartość null?!? – mzedeler

+0

WIELKA !!!! Uwielbiam to ładne i czyste rozwiązanie, jest po prostu idealne! Dzięki Baba! –

1

coś takiego:

$data = $_SESSION; 
foreach(explode('/', $seach) => $pos) { 
    $data = $data[$pos]; 
} 
return $data; 
+2

zmiana '= pos> $,' 'as' do ... i umieścić'; 'po' $ dane = $ dane [$ val] 'a to powinien działać –

+0

Tak. Masz rację. Mylić, nie używając wartości do niczego oprócz liczenia. – mzedeler

+0

dziękuję mzdeler, widzę ciebie i Babę podobnie. Dzięki!!! –

1

Można spróbować czegoś takiego. wykonuje rekursywne wyszukiwanie drzewa. W przypadku, gdy nie zostanie znalezione dopasowanie, zwróci ono false, inaczej zwróci gałąź lub liść na pożądanej ścieżce.

 function treeSearch($query, $array, $currentDepth = 0){ 
      if (is_string($query)) $query = explode("/", $query); 
      $term = $query[$currentDepth]; 
      if (isset($array[$term])){ 
       if ($currentDepth == count($query)-1){ 
        // we found it 
        return $array[$term]; 
       } else { 
        return treeSearch($query, $array[$term], ++$currentDepth); 
       } 
      } else { 
       // no matching branch; 
       return false; 
      } 

    } 

Przykład użycia

$array = array('First' => array('Second' => array('Third' => 'TEST VALUE'))); 
    print_r(treeSearch("First/Second", $array)); 
    print_r(treeSearch("First", $array)); 
    print_r(treeSearch("First/Second/Third", array)); 
Powiązane problemy