2013-06-04 13 views
5

Bir ikilem içine koşuyorum, bir diziden "dinamik olarak" arama işlevini oluşturmaya çalışıyorum, bu durumda oturum dizim, ancak herhangi biri için olmalıdır.Bir Array aracılığıyla Dinamik arama

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

: Şimdi bu benim sorunum İşte

i

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

ne Öyleyse ben bir dizi var diyelim var ... benim sorunum dinamik bunun yapılması gerek sağlamaktır değil, Şimdi ben

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

arayıp o zamanlar sen $ değer değişkeninin değeri olarak "test değerine" almak istiyorum.

çalıştığını Bu durumda

, ama sadece dinamik değil ve bunu daha fazla hattı eklemeden yanı belki de bir 10 kat derin diziyi idare edebilmek istiyorum ....

Belki de belki biri burada daha akıllı bana :)

Teşekkürler! Böyle

cevap

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

Fonksiyon

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

Live Demo

+0

Bu harika bir çözümdür. Bu sorunu bir kez yaşadığımda eval() 'e tekrar başvurduğumu kabul ettiğimden utanıyorum. – Andri

+0

Ama neden '' $ data = isset ($ data [$ key])? $ data [$ key]: sadece '' $ data = $ data [$ key] '' yerine null''? Böyle bir anahtar yoksa, '' $ data'' null olacak? – mzedeler

+0

BÜYÜK !!!! Bu güzel ve temiz çözümü çok seviyorum, sadece mükemmel! Teşekkürler Baba! –

1

şey:

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

değişim '=> $ konum,' 'as' içine ... ve bir' koymak Çalışmalı –

+0

Evet. Haklısın. Hiçbir şey için değer kullanmıyor, ama sayıyor. – mzedeler

+0

teşekkürler mzdeler, seni görüyorum ve Baba da aynı şekilde düşünüyor. Teşekkürler!!! –

1

Böyle bir şey deneyebilirsiniz kullanılır. özyinelemeli bir ağaç araması yapar. Herhangi bir eşleşme bulunmaması durumunda false geri dönecek, aksi takdirde şube ya da yaprak istenilen yola dönecektir. `Sonra` $ verileri = $ verileri [$ val] 've;

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

    } 

örnek Kullanım

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