2014-10-28 3 views
0

У меня есть массив, который выглядит следующим образом:Поиск массива по ключевому отрасли

$array = array (
    [level_1] => array (
     [level_2] => array (
      [level_3] => something 
     ) 
    ), 
    [level_12] => array (
     [level_2] => somethingelse 
    ), 
    [level_13] => array (
     [level_22] => array (
      [level_3] => something 
     ) 
    ), 
); 

ключи или значения не всегда являются уникальными, но ветвь.
И у меня есть строка, которая выглядит следующим образом:

$string = 'level_1-level_2-level_3'; 

те ключи для филиала.

И мне нужно как-то получить значение из массива на основе этой строки? Как это:

$string_array = explode('-', $string); 
$array[$string_array[0]][$string_array[1]][$string_array[2]] // something 

Но так как глубина может быть разной, это не является жизнеспособным решением ...

+0

Вам нужно создать рекурсивную функцию , что собирает результаты. – vaso123

+0

Просто создайте переменную с именем $ result, сделайте ее равной $ array, затем запустите цикл на вашем $ string_array, создав $ result = $ result [$ string_array [$ i]] –

ответ

1

Попробуйте этот простой пример, нет необходимости в рекурсивной функции:

function get_item($path, $array) 
{ 
    $paths = explode('-', $path); 

    $result = $array;  
    foreach ($paths as $path) { 
     isset($result[$path]) ? $result = $result[$path] : $result = false; 
    } 

    return $result; 
} 

$path = 'level_1-level_2-level_3'; 
echo get_item($path, $array); 
+0

Не должно быть разрыва в цикле, если результат неверен? Или это нормально обрабатывать логическое значение как массив? –

+0

Я полагаю, что это нужно, но PHP не бросает никаких предупреждений или уведомлений при использовании 'isset()' таким образом – Danijel

+0

Nice. Это хорошо знать спасибо –

0

Сделать $result переменную, которая изначально указывает на корень из массива, и цикл по уровням вашего $string_array 'til $result указывает на лист, который вы искали.

// stuff you already have: 

$array = array(...); // your big array 
$string = 'level_1-level_2-level_3'; 
$string_array = explode('-', $string); 

// new stuff: 

$result = $array; 
foreach ($string_array as $level) { 
    $result = $result[$level]; 
} 

echo $result; // 'something' 

Рабочий пример: Ideone

+0

Он будет работать нормально, если '$ string' в порядке, но он будет генерировать неопределенную ошибку индекса, если это не так. – Danijel

1

Попробуйте это:

$array = array (
    'level_1' => array (
     'level_2' => array (
      'level_3' => 'something' 
     ) 
    ), 
    'level_12' => array (
     'level_2' => 'somethingelse' 
    ), 
    'level_13' => array (
     'level_22' => array (
      'level_3' => 'something' 
     ) 
    ), 
); 
$string = 'level_1-level_2-level_3'; 
$keys = explode('-', $string); 

echo getItemIterative($keys, $array); 
echo "\n"; 
echo getItemRecursive($keys, $array); 


function getItemIterative($keys, $array) 
{ 
    $value = null; 
    foreach ($keys as $key) { 
     if ($value == null) { 
      $value = $array[$key]; 
     } 
     if (is_array($value) && array_key_exists($key, $value)) { 
      $value = $value[$key]; 
     } 
    } 
    return $value; 
} 

function getItemRecursive($keys, $array) 
{ 
    $key = array_shift($keys); 
    $value = $array[$key]; 
    if (empty($keys)) { 
     return $value; 
    } else { 
     return getItemRecursive($keys, $value); 
    } 
} 
Смежные вопросы