2010-01-21 7 views
1

파일 이름을 가져 와서 파일 이름의 카운터를 증가시키고 반환하는 함수를 생성했습니다. 그러나 반환 값이 파일 이름을 반환하지 않는다는 것을 제외하면 모든 것이 올 바릅니다.PHP 함수가 문자열을 반환하지 않습니다.

도움이 필요하십니까?

내 코드 : 사전에

$filename = join("", array_reverse($date)); 
$filename .= ".xml"; 
$dir = "../gigs"; 
$file = $dir."/".$filename; 

function getNewFileName($filename, $dir) { 
if (is_file("$dir/$filename")) { 
    if (strpos($filename, "_") === false) { 
     $filename = str_replace(".xml","_1.xml",$filename); 
     getNewFileName($filename, $dir); 
    } 
    else { 
      $pos = strpos($filename, "_"); 
      $counter = (int)substr($filename, $pos+1,1); 
      $counter++; 
      $filename = substr($filename,0, $pos)."_".$counter.".xml"; 
      getNewFileName($filename, $dir); 
     } 
    } else { 
       // echoing HERE shows that the string is manipulated correctly 
     return (string)$filename; // but returning here is not working 
    } 
} 

echo getNewFileName($filename, $dir); // <- this last line prints nothing out 

감사합니다. , 첫째

function getNewFileName($filename, $dir) { 
    if (is_file("$dir/$filename")) { 
     if (strpos($filename, "_") === false) { 
      $filename = str_replace(".xml","_1.xml",$filename); 
      return getNewFileName($filename, $dir); 
     } 
     else { 
       $pos = strpos($filename, "_"); 
       $counter = (int)substr($filename, $pos+1,1); 
       $counter++; 
       $filename = substr($filename,0, $pos)."_".$counter.".xml"; 
       return getNewFileName($filename, $dir); 
     } 
    } 
    return (string)$filename; 
} 

echo getNewFileName($filename, $dir); // <- this last line prints nothing out 
+0

은 $ 파일 이름의 가치는 $ 입력하는 디렉토리는 무엇인가? – Natrium

+5

'return' 문이 누락 되었습니까? – Gordon

+0

'return' 문 바로 전에'return' 문 바로 앞에 '$ filename'을 반향시킬 때 문자열이 100 % 정확하지만 반환 값을 반환하지 않는'재귀 함수 '가 있기 때문입니다. –

답변

11

라인 :

getNewFileName($filename, $dir); 

가 필요로하는 return :

return getNewFileName($filename, $dir); 
+0

사실, 그 행의 두 가지 경우 모두 발생합니다. – Gareth

+0

대단히 감사합니다! 나는 그게 왜 효과가 있는지 이해하지 못한다. 너는 나에게 설명해 주겠니? –

+3

당신은 재귀 함수 호출을하고 있습니다. 반환 값을 스택에 반환하지 않으면 기본 사례가 true로 평가되지 않습니다. –

1

이것은 함수가 어떻게 보일지입니다. 둘째, 당신은 단지 getNewFileName()에 재귀 호출에서 반환하지 않는 :

function getNewFileName($filename, $dir) { 
    if (is_file("$dir/$filename")) { 
    if (strpos($filename, "_") === false) { 
     $filename = str_replace(".xml","_1.xml",$filename); 
     return getNewFileName($filename, $dir); // here 
    } else { 
     $pos = strpos($filename, "_"); 
     $counter = (int)substr($filename, $pos+1,1); 
     $counter++; 
     $filename = substr($filename,0, $pos)."_".$counter.".xml"; 
     return getNewFileName($filename, $dir); // and here 
    } 
    } else { 
    return (string)$filename; 
    } 
} 

를 그 의도의 가정.

0

시도하고 들여 쓰기가 읽을 수 있도록 코드를 포맷하십시오

-1
function getNewFileName($filename, $dir) { 
    if (is_file("$dir/$filename")) { 
    if (strpos($filename, "_") === false) { 
     $filename = str_replace(".xml","_1.xml",$filename); 
     return (string)$filename; 
    } else { 
     $pos = strpos($filename, "_"); 
     $counter = (int)substr($filename, $pos+1,1); 
     $counter++; 
     $filename = substr($filename,0, $pos)."_".$counter.".xml"; 
     return (string)$filename; 
    } 
    } else { 
    return (string)$filename; 
    } 
} 

함수에 무한 루프가 있습니다.

+0

내부 함수 호출이 외부 함수에 인수를 전달하기 전에 인수를 변경했기 때문에 무한대로 루프되지 않았습니다. – Gareth

+0

당신 말이 맞아요, 미안 해요. – Thomas

관련 문제