2011-12-19 2 views
0

다음과 같은 다차원 배열을 통해 재귀 함수를 사용하여 특정 값을 찾으려고 시도합니다. 즉, 특정 학교에 다녔거나, 특정 주제에 전공했거나, 특정 직업을 갖고있는 사람들을 찾으려고합니다. 궁금 할 경우이 배열은 Facebook Graph API에서 출력됩니다. 실제로 사용자가 가지고있는 친구의 수에 따라 3 개 이상의 오프셋 배열이 있습니다. 수천 개가 될 수 있습니다.다차원 배열에 대한 재귀 함수?

그래서

당신에게 방법의 아이디어를 제공하기 위해 다음과 같습니다

내가 재귀 함수의 아주 작은 지식을 시도한 솔루션입니다 (내 첫번째 생각은 내가 발견 전에 MD 어레이 작동하지 않았다와 in_array 사용하는 것이 었습니다)

$friend = $fqlResult[0]['name']; 
echo "$friend"; 

내가 사람의 이름을 삭제하기 때문에 출력은 "BLANK"가 될 것입니다 * : 작품 아래 MD 배열은,이 코드 조각을 확인하십시오.

$data = $fqlResult; 
$collegemajor = (isset($value['education'][0]['concentration'][0]['name'])) ? $value['education'][0]['concentration'][0]['name'] : null ; 
$major = "Business Administration"; 
if (isset($collegemajor)) { 
    foreach($data as $key=> $value) { 
      if ($value($collegemajor) == $major) { 
       echo "User $key is majoring in $major"; 
    } 
    } 
} 

그래서 위에서 언급 한 다차원 배열이 있습니다. 이 예에서는 Business Admin을 전공 한 모든 사용자의 친구 이름을 가져 오려고합니다. 대학에서. 이 스 니펫에서 알 수 있듯이 배열의 긴 버전에는 아무 것도 없습니다 (생각합니다). 많이 있습니다. 위의 코드는 출력을 생성하지 않으며 작동하게 만드는 방법에 관해서는 분실했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

Array 
(
[0] => Array 
    (
     [name] => BLANK 
     [education] => 
     [work] => 
    ) 

[1] => Array 
    (
     [name] => BLANK 
     [education] => Array 
      (
       [0] => Array 
        (
         [school] => Array 
          (
           [id] => 108087985890571 
           [name] => St. Andrew's School 
          ) 

         [year] => Array 
          (
           [id] => 138383069535219 
           [name] => 2005 
          ) 

         [type] => High School 
        ) 

       [1] => Array 
        (
         [school] => Array 
          (
           [id] => 20697868961 
           [name] => Boston University 
          ) 

         [concentration] => Array 
          (
           [0] => Array 
            (
             [id] => 108654845832522 
             [name] => Business Administration 
            ) 

          ) 

         [type] => College 
        ) 

       [2] => Array 
        (
         [school] => Array 
          (
           [id] => 108289315859633 
           [name] => University of Miami 
          ) 

         [year] => Array 
          (
           [id] => 138879996141011 
           [name] => 2013 
          ) 

         [type] => Graduate School 
        ) 

      ) 

     [work] => Array 
      (
      ) 

    ) 

[2] => Array 
    (
     [name] => BLANK 
     [education] => Array 
      (
       [0] => Array 
        (
         [school] => Array 
          (
           [id] => 115444241803885 
           [name] => Saint Andrews High School 
          ) 

         [year] => Array 
          (
           [id] => 137616982934053 
           [name] => 2006 
          ) 

         [type] => High School 
        ) 

       [1] => Array 
        (
         [school] => Array 
          (
           [id] => 112033702149888 
           [name] => Boca Raton High 
          ) 

         [year] => Array 
          (
           [id] => 137616982934053 
           [name] => 2006 
          ) 

         [type] => High School 
        ) 

       [2] => Array 
        (
         [school] => Array 
          (
           [id] => 108087985890571 
           [name] => St. Andrew's School 
          ) 

         [type] => High School 
        ) 

       [3] => Array 
        (
         [school] => Array 
          (
           [id] => 107573562605861 
           [name] => Duke University 
          ) 

         [concentration] => Array 
          (
           [0] => Array 
            (
             [id] => 104045469631213 
             [name] => Political science 
            ) 

          ) 

         [type] => College 
        ) 

      ) 

     [work] => 
    ) 

[4] => Array 
    (
     [uid] => 1234567 
     [name] => BOB NO ONE 
     [education] => Array 
      (
       [0] => Array 
        (
         [school] => Array 
          (
           [id] => 106039752760627 
           [name] => Berwick Academy 
          ) 

         [year] => Array 
          (
           [id] => 137616982934053 
           [name] => 2006 
          ) 

         [type] => High School 
        ) 

       [1] => Array 
        (
         [school] => Array 
          (
           [id] => 108087985890571 
           [name] => St. Andrew's School 
          ) 

         [type] => High School 
        ) 

       [2] => Array 
        (
         [school] => Array 
          (
           [id] => 105690226130720 
           [name] => Northeastern University 
          ) 

         [concentration] => Array 
          (
           [0] => Array 
            (
             [id] => 108654845832522 
             [name] => Business Administration 
            ) 

          ) 

         [type] => College 
         [classes] => Array 
          (
           [0] => Array 
            (
             [id] => 189873264368867 
             [name] => 2011 
            ) 

          ) 

        ) 

      ) 
+0

같은

전화 당신은 넓은 재귀 검색, 또는 특정 일을 하시겠습니까? [예 : 기괴하게, 누군가의 학교가 이름이 Bus.Admin 인 경우, 검색을 통해 침을 뱉어 내고 싶습니까?] – Shad

+0

위에서 볼 수 있듯이 학교와 전공에서는 실제로 이드가 할당되었으므로 이드의 검색 할 때. – buttonitup

답변

0

나무의 깊이가 항상 고정되어 있고 구조가 알려져 있기 때문에 실제로 이런 식으로 재귀 할 필요가 없습니다.

function arraySearch($key, $value, $array){ 
    $flag = FALSE; 
    foreach($array as $result){ 
    if(arraySearch($key, $value, $result)){ 
     $flag = TRUE 
    }elseif(isset($result[$key] && $result[$key] == $value){ 
     $flag = TRUE; 
    } 
    } 
    return $flag 
} 

오히려에 $ 플래그를 설정보다 성능을 향상시키기 위해, 당신은 배열의 특정 필드에 특정 값을 찾을 수 기능을 원하는

$friends = $fqlResult; 
$friends_BA = array(); 

foreach ($friends as $friend) { 
    if (is_array($friend['education'])) { 
     foreach ($friend['education'] as $school) { 
      if (isset($school['concentration'])) { 
       foreach ($school['concentration'] as $concentration) { 
        if (strpos(strtolower($concentration['name']), 'business') !== false) { 
         $friends_BA[] = $friend; 
         continue 3; // skip to the next friend 
        } 
       } 
      } 
     } 
    } 
} 

var_dump($friends_BA); 
+1

경고 : C : \ xampp \ htdocs \ pathweavr \ friendtest.php 93에서 foreach()에 잘못된 인수가 제공되었습니다. – buttonitup

+0

이 문제에 대한 코드를 해독하면 추가 할 수 있습니다. 몇 주 동안 어려움을 겪어 왔지만, 나는 진심으로 당신을 빚질 것이다. – buttonitup

+0

죄송 합니다만, 나는 [교육]이 어떤 경우에는 'null'일 수 있음을 알지 못했습니다. 방금 답변을 업데이트했습니다 ... 해당 버전을 사용해보십시오. – brianreavis

0

: 트릭을 할 것입니다 일부 중첩 루프를 사용하여 사실, 함수의 실행을 멈추고 배열 검색을 계속할 수 없으므로 true를 반환 할 수 있습니다. 그래서

foreach($fqlResult as $result){ 
    if(arraySearch('concentration', 'Business Administration', $result)){ 
    //You have found a user you are looking for, echo $result['name'] or do what you want with the result. 
    } 
}