2011-10-31 6 views
0

이전 부품 번호 가격을 업데이트해야하는 자동 시작 번호가있는 데이터베이스가 있습니다. 각 행에는 부품 번호 (필드 이름 "마스터")와 대체 된 (최신) 부품 번호 (필드 이름 "pnc")가있는 필드가 있습니다. 스크립트는 "pnc"필드가 비어 있지 않은지 확인해야합니다. 그것이 아니라면, 그 번호에 대한 가격을 붙잡아 야합니다. 충분히 쉬워.재귀 함수는 아무 것도 반환하지 않습니다.

그러나 일부 부품 번호는 가장 최근의 부품 번호 및 가격에 도달 할 때까지 통과 할 알 수없는 번호가 있습니다. 그래서 재귀 함수가 최상의 솔루션이라고 생각했습니다. 그러나 올바르게 작동하지 않습니다. 여기 코드는 : 무슨 일

public function updatePricing() 
    { 
     //method to update pricing by referencing supersession prices 
     $sql = "SELECT * FROM prices"; 
     $result = mysql_query($sql); 
     $num_rows = mysql_num_rows($result); 

     for($i=0;$i<2000;$i++) //using 2000 for testing, use $num_rows after 
      { 
       $row = mysql_fetch_array($result); 
       $id = $row['id']; 
       $super_num = $row['pnc']; 

       //if there is a supersession in this row find original 
       if(!empty($super_num)) 
        { 
         $final_super_price = $this->findSuperPrice($super_num); 

         echo "partnum: " . $row['master']; 
         echo "&nbsp;&nbsp;"; 
         echo "price: " . $final_super_price . "<br /><br />"; 
        } 
      } 
    } 

public function findSuperPrice($part_num) 
    { 
     $sql = "SELECT * FROM prices WHERE master='" . $part_num . "'"; 
     $result = mysql_query($sql); 
     $row = mysql_fetch_array($result); 

     if (empty($row['pnc'])) //if there aren't any supersession numbers 
      { 
       $final_price = $row['list']; 
       return $final_price; 
      } 
     else //recursively call itself until we find the last number 
      { 
       $this->findSuperPrice($row['pnc']); 
      } 
    } 

그것이 "PNC"필드에 항목이 행을 찾을 때까지 updatePricing() 함수가 실행됩니다. 그럴 때 findSuperPrice() 함수가 호출됩니다. findSuperPrice() 함수는 "pnc"필드가 비어있을 때까지 재귀 적으로 실행되어야합니다. 그럴 경우 숫자가 반환됩니다.

그러나 실제로 findSuperPrice()에서 if 문의 else 부분에 도달하면 아무 것도 반환하지 않습니다. 기본적으로 깊이가 한 단계 이상인 경우. 나는 어떤 에러도 내지 않고있다. 그것은 단지 빈 문장을 반환하는 것이다. 거기에 정보가 돌아 왔음을 확인했습니다. 감사.

더 큰 클래스의 내부에 있음을 언급해야합니다. 나머지 수업은이 두 가지 방법에 영향을 미치지 않습니다.

+1

대신에'do {} while()'루프를 사용해보십시오. DB 구조가 재귀적일 때, 실제 재귀 호출을 사용하여 트리를 처리 할 필요가 없습니다. –

답변

4

값을 반환해야합니다. 이에

else //recursively call itself until we find the last number 
    { 
     $this->findSuperPrice($row['pnc']); 
    } 

:

else //recursively call itself until we find the last number 
    { 
     return $this->findSuperPrice($row['pnc']); 
    } 
2

$row['pnc']이 비어 있지 않은 경우 findSuperPrice의 결과가 무시되므로 현재 값을 반환하지 않습니다. 재귀 호출의 값을 올바르게 반환하십시오.

return $this->findSuperPrice($row['pnc']); 
1

당신은 findSuperPrice 내부 else 경우 return 문을 누락이 코드를 변경합니다.

하지만 ... 하나의 필드 만보고 조작하기 위해 많은 양의 데이터를 펌핑하는 것처럼 보입니다. 여기에 게시 한 함수와 비슷한 mysql 함수를 작성할 수도 있습니다. MySQL: Get Root Node of Parent-Child Structure

이렇게하면 데이터베이스에서 필요한 값을 직접 쿼리 할 수 ​​있습니다. 테이블 구조가 있다면 기꺼이 도와 드리겠습니다.

관련 문제