2013-06-04 7 views
5

나는 딜레마에 빠져있다. 배열에서 물체를 동적으로 검색하는 함수를 만들려고하는데,이 경우에는 내 세션 배열이지만 반드시 있어야한다.배열을 통한 동적 검색

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

: 이제 내 문제는 여기에

내가

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

을 가지고있는 그래서 내가 배열이 있다고 가정하자의 ... 내 문제는 동적으로이 작업을 수행 할 수 있도록하는 것입니다 아니다 이제 전화를 걸고 싶습니다.

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

그런 다음 "테스트 값"을 my $ value 변수의 값으로 되돌립니다.

작동이 상황에서

하지만, 그것은 단지 동적이지, 나는 더 많은 라인을 추가하지 않고,뿐만 아니라 어쩌면 10 층 깊은 배열을 처리 할 수 ​​있어야합니다 ....

글쎄 어쩌면 여기에 더 똑똑한 사람 :)

감사합니다 !! 이 같은

답변

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

기능

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

Live Demo

+0

이것은 훌륭한 해결책입니다. 나는이 문제가 한 번 있었을 때 eval()에 재발했다는 것을 인정하기가 부끄럽다. – Andri

+0

하지만''$ data = isset ($ data [$ key])? ''$ data = $ data [$ key]''대신에 $ data [$ key] : null''을 사용할 수 있습니까? 그러한 키가 없다면,''$ data''는 null이 될 것입니다.?!? – mzedeler

+0

대단한 !!!! 이 멋지고 깨끗한 솔루션을 좋아합니다. 완벽합니다. 바바 고마워! –

1

뭔가 :

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

변화'=> $ POS는'as' '으로 ... 및'넣어 작동해야합니다 –

+0

예. 네가 옳아. 아무 것도 계산하지 않고 값을 사용하지 않음으로써 혼란 스럽습니다. – mzedeler

+0

감사합니다 mzdeler, 나는 당신과 바바가 비슷하게 생각하는 것을 보았습니다. 감사!!! –

1

당신이 뭔가를 시도 할 수 있습니다 사용합니다. 재귀 트리 검색을 수행합니다. 일치하는 것이 발견되지 않으면 false을 반환하고, 그렇지 않으면 원하는 경로에서 분기 나 잎을 반환합니다. `후`$ 데이터 = $ 데이터 [$ 브로] '과;

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

    } 

사용 예

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