2011-12-15 4 views
1

이 경우 필요한 논리는 간단 할 수도 있고 그렇지 않을 수도 있지만 알아낼 수는 없습니다. 그래서 도움을 청합니다.PHP 배열 반복 논리 관련 문제

Array=> 
    [0]=> 
     ['name'] = item1 
     ['id'] = 1 
     ['parent_id'] = 0 
    [1]=> 
     ['name'] = item2 
     ['id'] = 2 
     ['parent_id'] = 1 
    [2]=> 
     ['name'] = item3 
     ['id'] = 3 
     ['parent_id'] = 5 

지금, 나는 각이 목록의 모든 항목에 대한 경로를 확인해야합니다 :

쿼리 후, 나는 조금 다음과 같습니다 배열을 얻을. 경로는 항목 1에 대해 /item1이고 항목 2에 대해서는 /item1/item2과 같습니다.

참고 : 항목이 반드시 순서에 있어야하는 것은 아닙니다. 상위 항목은 하위 항목 뒤에 올 수 있습니다 ...

그래서 기본적으로 항목이 생기면 항목 이름 앞에 슬래시를 씁니다. 그런 다음 parent_id을보고 parent_id의 이름 앞에 슬래시를 씁니다.

그런 다음 부모의 parent_id을보고 그 이름 앞에 슬래시를 씁니다. parent_id이 0이 될 때까지이 작업을 계속 수행합니다. 어느 시점에서 배열에 값을 할당하므로 paths['item2'] = "/item1/item2"과 같은 것으로 다음 ID로 이동하여 반복됩니다!

여러분 모두의 도움에 감사드립니다. 좋은 하루 되세요!

편집 : item3의 id가 수정되었으므로 모든 항목의 ID가 다릅니다. 나는 질문을 개선하기 위해 질문을 받았다 : 최종 출력 배열은 다음과 같이 조금 보일 것입니다 :

Array=> 
    ["item1"]="/item1" 
    ["item2"]="/item1/item2" 
    ["item3"]="/item5/item3"  

최종 출력은 옵션으로 각 항목과 HTML 선택 폼 것을, 나는 그것의가 필요 경로는 어떻게 든 숨겨진 필드 또는 Ajax 등을 통해 연결됩니다.

편집 : 문제가 해결되었습니다. 나는 누군가 다른 사람이이 문제를 우연히 발견 할 경우를 대비해서 여기에 해결책을 쓰려고했다. 참고 : 여전히 작동 방식은 확실하지 않지만 작동합니다! 비효율적 일 수도 있습니다. 모르겠습니다.

function getCollPath($proj_list, $length){ 
$total_path = ""; 
$paths = array(); 
for ($j = 0; $j < $length + 1; $j++){ 
    if (isset($proj_list[$j])){ 
     $id = $j; 
     $name = $proj_list[$j]['name']; 
     $total_path = getItemPath($proj_list, $id, NULL); 
     $paths[$name] = $total_path; 
    } 
} 
return $paths; 
}  

function getItemPath($proj_list, $current_id, $path){ 

$current_parent_id = $proj_list[$current_id]['parent_id']; 
$current_name = $proj_list[$current_id]['name']; 
$current_path = "/".$current_name; 
if ($current_parent_id == 0){ 
     if (isset($path)){ 
     return $current_path.$path; 
     } 
     else{ 
     return $current_path; 
     } 
} 
else{ 
    if (!isset($path)){ 
     $path = $current_path; 
    } 
    return getItemPath($proj_list, $current_parent_id, $path); 
} 
} 
+2

왜 'item2'와 (와) 같은 item3이 같은 id를 공유합니까? – webbiedave

+0

최종 출력은 무엇입니까? – Jon

+0

@webbiedave 그저 오타입니다. 모든 이드는 고유해야합니다. – zermy

답변

1

재귀 함수. id = child.parent_id 인 배열 요소를 찾습니다. 그런 다음 parent_id = ""또는 "0"인 요소에 도달 할 때까지 현재 parent_id를 매개 변수로 사용하여 self를 호출합니다. 이동 경로 (breadcrumb) 세그먼트를 부모 호출로 반환해야 원래 호출이 전체 경로를 얻습니다.