2013-06-04 45 views
5

Tôi đang gặp một tình huống khó xử, tôi đang cố gắng tạo một hàm để tìm kiếm động "máng" một mảng, trong trường hợp này là mảng phiên của tôi, nhưng nó nên là cho bất kỳ. Bây giờ không phải là vấn đề của tôi, vấn đề của tôi là để tự động cho phép điều này được thực hiện ...Tìm kiếm động thông qua một mảng

Đây là những gì tôi có

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

Vì vậy, chúng ta hãy nói rằng tôi có một mảng:

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

Bây giờ tôi muốn gọi

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

và sau đó nhận "Giá trị thử nghiệm" trở lại làm giá trị cho biến giá trị $ của tôi.

Trong trường hợp này nó hoạt động, nhưng nó không phải là năng động, và tôi muốn nó có thể xử lý thậm chí một mảng sâu 10 lớp là tốt, mà không cần thêm nhiều hơn và nhiều hơn nữa ...

Có lẽ ai đó ở đây thông minh hơn tôi :)

Cảm ơn !!

Trả lời

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

Chức năng sử dụng

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

Live Demo

+0

Đây là một giải pháp tuyệt vời. Tôi xấu hổ khi thừa nhận tôi đã lặp lại eval() khi tôi gặp vấn đề này một lần. – Andri

+0

Nhưng tại sao '' $ data = isset ($ data [$ key])? $ data [$ key]: null'' thay cho chỉ '' $ data = $ data [$ key] ''? Nếu không có khóa như vậy, '' $ data'' sẽ là null?!? – mzedeler

+0

TUYỆT VỜI !!!! Tôi thích giải pháp tốt đẹp và sạch sẽ này, nó chỉ đơn giản là hoàn hảo! Cảm ơn Baba! –

1

Something như thế này:

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

thay đổi '=> $ pos,' thành 'as' ... và đặt một ';' sau' $ data = $ data [$ val] 'và nó nên hoạt động –

+0

Có. Bạn đúng. Bối rối bằng cách không sử dụng các giá trị cho bất cứ điều gì nhưng đếm. – mzedeler

+0

cảm ơn mzdeler, tôi thấy bạn và Baba nghĩ như nhau. Cảm ơn!!! –

1

Bạn có thể thử một cái gì đó như thế này. nó thực hiện tìm kiếm cây đệ quy. Trong trường hợp không tìm thấy kết quả phù hợp, nó sẽ trả về false nếu không nó sẽ trả về nhánh hoặc lá ở đường dẫn mong muốn.

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

    } 

dụ Cách sử dụng

$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)); 
Các vấn đề liên quan