2015-07-28 18 views
5

mam tej tablicy stogu siana:Recursive wyszukiwania w tablicy PHP ze ścieżką

$array = [ 
    [ 
     "name" => "Intro", 
     "id" => "123", 
     "children" => [ 
     "name" => "foo", 
     "id" => "234", 
     "children" => [ 
      "name" => "mur", 
      "id" => "445", 
     ] 
     ] 
    ],[ 
     "name" => "chapter one", 
     "id" => "9876", 
     "children" => [ 
     "name" => "foo", 
     "id" => "712", 
     "children" => [ 
      "name" => "bar", 
      "id" => "888", 
     ] 
     ] 
    ] 
]; 

i to igła tablicy: $needle = ["chapter one","foo","bar"]

pracuję nad rekurencyjnej funkcji wyszukiwania, które zwróci wartość id z następujących dopasowanie elementu potomnego na kolumnie name podążając ścieżką $needle.

W tym przykładzie powinien powrócić 888. Mam to do tej pory, ale nie wiem jak śledzić ścieżkę $ igły, w przeciwieństwie do wyszukiwania wartości przy założeniu, że są unikatowe. Doceniam każdą pomoc, ustawiając mnie na właściwej drodze.

function searchTree($needle, $haystack, $strict=false, $path=array()) 
{ 
    if(!is_array($haystack)) { 
     return false; 
    } 

    foreach($haystack as $key => $val) { 
    if(is_array($val) && $subPath = searchTree($needle, $val, $strict, $path)) { 
     $path = array_merge($path, array($key), $subPath); 
     return $path; 
    } elseif((!$strict && $val == $needle) || ($strict && $val === $needle)) { 
     $path[] = $key; 
     return $path; 
    } 
    } 
    return false; 
} 
+0

Zakładam, ponieważ jest rekurencyjne, że '$ needle' może pomieścić nieskończone wartości czy zawsze będzie 3? – Darren

+0

@Darren nieskończenie wiele wartości. Elementy na tym samym poziomie tablicy mają unikalne nazwy. – greener

Odpowiedz

4

postaram się go oczyścić trochę, ale to działa:

$needle = ["chapter one", 'foo', 'bar']; 
$array = [ 
    [ 
     "name" => "Intro", 
     "id" => "123", 
     "children" => [ 
      "name" => "foo", 
      "id" => "234", 
      "children" => [ 
       "name" => "mur", 
       "id" => "445", 
      ] 
     ] 
    ],[ 
     "name" => "chapter one", 
     "id" => "9876", 
     "children" => [ 
      "name" => "foo", 
      "id" => "712", 
      "children" => [ 
       "name" => "bar", 
       "id" => "888", 
      ] 
     ] 
    ] 
]; 

function searchTree($needle, $haystack, $strict=false) { 
    if(!is_array($haystack)) { 
     return false; 
    } 
    $match = false; 
    if(array_keys($haystack) !== range(0, count($haystack) - 1) && !empty($needle)) { 
     if(($strict && $haystack['name'] === $needle[0]) || (!$strict && $haystack['name'] == $needle[0])) { 
      $match = true; 
      array_shift($needle); 
      if (!empty($needle)) { 
       return searchTree($needle, $haystack['children'], $strict); 
      } 
     } 
    } else { 
     foreach ($haystack as $key => $value) { 
      if (is_array($value) && !empty($needle)) { 
       if (($strict && $value['name'] === $needle[0]) || (!$strict && $value['name'] == $needle[0])) { 
        $match = true; 
        array_shift($needle); 
        if (!empty($needle)) { 
         return searchTree($needle, $value['children'], $strict); 
        } else { 
         $haystack = $haystack[$key]; 
        } 
       } 
      } 
     } 
    } 
    return (isset($haystack['id']) && $match) ? $haystack['id'] : false; 
} 

echo searchTree($needle, $array); 

wyjściowa:

888 
+0

Och, to jest niesamowite. Działa, z wyjątkiem sytuacji, gdy w '$ needle' jest tylko jedna wartość. – greener

+0

Praca nad nim. Potrzebuję regulacji jeszcze, zauważyłem. –

+0

OK, to powinno teraz działać w pełni. –