2013-06-04 4 views
5

Я столкнулся с дилеммой, я пытаюсь создать функцию для «динамического» поиска через массив, в этом случае мой массив сеансов, но он должен быть для любого. Теперь это не моя проблема, моя проблема заключается в динамически позволяют это сделать ...Динамический поиск по массиву

Вот что у меня есть

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

Так скажем, у меня есть массив:

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

Теперь я хочу позвонить

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

, а затем вернуть значение «Test Value» в качестве значения для переменной $ 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 [$ key]: null'' вместо просто '' $ data = $ data [$ key] ''? Если такого ключа нет, '' $ data' будет null?!? – mzedeler

+0

GREAT !!!! Мне нравится это приятное и чистое решение, это просто отлично! Спасибо, Баба! –

1

Что-то вроде этого:

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

изменения '=> $ поз,' 'в как' ... и положить'; 'после' $ данных = $ данных [$] Вэл ', и это должен работать –

+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)); 
Смежные вопросы