2013-06-04 17 views
5

Sto correndo un dilemma, sto provando a creare una funzione per la ricerca "dinamica" attraverso un array, in questo caso il mio array di sessione, ma dovrebbe essere per qualsiasi. Ora che non è il mio problema, il mio problema è quello di consentire in modo dinamico ciò avvenga ...Ricerca dinamica attraverso una matrice

Ecco quello che ho

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]]; 
} 

Quindi diciamo che ho un array:

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

ora voglio chiamare

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

e quindi ottenere "test value" indietro come valore per la mia variabile $ value.

In questa situazione funziona, ma semplicemente non è dinamica, e voglio che sia in grado di gestire forse anche una matrice profonda 10 strato così, senza l'aggiunta di sempre più linee ....

Beh, forse qualcuno qui fuori più intelligente di me :)

Grazie !!

risposta

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

funzione utilizzata

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

Live Demo

+0

Questa è un'ottima soluzione. Mi vergogno di ammettere che mi sono ricor- dato a eval() quando ho avuto questo problema una volta. – Andri

+0

Ma perché il '' $ data = isset ($ data [$ key])? $ data [$ key]: null'' al posto di '' $ data = $ data [$ key] ''? Se non esiste una chiave di questo tipo, '' $ data'' sarà nullo?!? – mzedeler

+0

GRANDE !!!! Adoro questa soluzione bella e pulita, semplicemente perfetta! Grazie Baba! –

1

Qualcosa di simile a questo:

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

cambiamento '=> $ pos,' 'in as' ... e mettere un'; '' dopo $ data = $ data [$ val] 'e IT dovrebbe funzionare –

+0

Sì. Hai ragione. Confuso non usando i valori per qualsiasi cosa ma il conteggio. – mzedeler

+0

grazie mzdeler, vedo che tu e Baba pensate allo stesso modo. Grazie!!! –

1

si può provare qualcosa di simile. fa una ricerca albero ricorsiva. Nel caso in cui non venga trovata alcuna corrispondenza, restituirà un valore false altrimenti restituirà il ramo o il foglio nel percorso desiderato.

 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; 
      } 

    } 

esempio di utilizzo

$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)); 
Problemi correlati