변수 만 참조로 전달해야합니다.


246
// Other variables
$MAX_FILENAME_LENGTH = 260;
$file_name = $_FILES[$upload_name]['name'];
//echo "testing-".$file_name."<br>";
//$file_name = strtolower($file_name);
$file_extension = end(explode('.', $file_name)); //ERROR ON THIS LINE
$uploadErrors = array(
    0=>'There is no error, the file uploaded with success',
    1=>'The uploaded file exceeds the upload max filesize allowed.',
    2=>'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
    3=>'The uploaded file was only partially uploaded',
    4=>'No file was uploaded',
    6=>'Missing a temporary folder'
);

어떤 아이디어? 이틀 후에도 여전히 붙어 있습니다.


답변:


515

explode변수에 결과를 할당하고 해당 변수를 end다음에 전달하십시오 .

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

문제는 end배열의 내부 표현을 수정하기 때문에 참조 가 필요 하다는 것입니다 (즉, 현재 요소 포인터 가 마지막 요소를 가리 키도록합니다).

의 결과 explode('.', $file_name)는 참조로 전환 될 수 없습니다. 이것은 PHP 언어의 제한 사항으로, 단순성 때문에 존재할 수 있습니다.


12
정말 고마워 내 문제를 해결했다.
Frank Nwoko

1
@Oswald,을 사용하여 경고를 끌 수 있습니다 error_reporting. 그렇게하는 것이 안전한가요?
Pacerier

9
꺼도 안전합니다 error_reporting. 맹목적으로 오류를 무시하는 것은 안전하지 않습니다. 끄는 error_reporting것은 맹목적으로 오류를 무시하기위한 주요 단계입니다. 프로덕션 환경에서는 display_errors대신 끄고 오류를 로그 파일에 기록하십시오.
Oswald

작동하지 않는. 아래의 답변-이중 괄호-작동합니다.
bbe

감사합니다. 시간을 많이 절약하세요!
simon

52

PHP 7 호환 적절한 사용법 :

$fileName      = 'long.file.name.jpg';
$tmp           = explode('.', $fileName);
$fileExtension = end($tmp);

echo $fileExtension;
// jpg

3
기묘한. 작동하지만 어떻게? @접두사 와 비슷한 경고를 표시 하지 않습니까?
Nigel Alderton

6
괄호를 추가하면 왜 오류가 제거됩니까?
Nigel Alderton

8
나는이 기발한 것을 연구했는데 버그 인 것 같 습니까? PHP 파서 이중 괄호 "(())"을 참조하게하는 일반 값으로 변환한다. 이 링크 에 대한 추가 정보 .
Callistino

26
나는 이것을 좋아한다.. 그러나 나는 그것을 동시에 좋아하지 않는다. 내 일을 :-) 망치고 주셔서 감사합니다
billynoah

4
php7에서는 여전히 경고가 발행됩니다. php.net/manual/en/…
kosta

49

다른 사람들은 이미 오류가 발생한 이유를 알려 주었지만 원하는 작업을 수행하는 가장 좋은 방법은 다음과 같습니다. $file_extension = pathinfo($file_name, PATHINFO_EXTENSION);


1
나는 동의한다. 적절한 API가 있으면 문자열 조작을 사용하여 파일 경로를 구문 분석 할 필요가 없습니다.
gd1

18

배열을 explode ()에서 변수로 저장 한 다음이 변수에서 end ()를 호출하십시오.

$tmp = explode('.', $file_name);
$file_extension = end($tmp);

btw :이 코드를 사용하여 파일 확장자를 얻습니다.

$ext = substr( strrchr($file_name, '.'), 1);

여기서 strrchr지난 후 문자열을 추출 .substr오프 삭감.


9

이 시도:

$parts = explode('.', $file_name);
$file_extension = end($parts);

그 이유는 인수를 end참조로 전달 하기 때문입니다 end. 최종 포인터로 내부 포인터를 이동시켜 배열을 수정하기 때문 입니다. 변수를 전달하지 않으면 참조 할 항목이 없습니다.

자세한 내용 end은 PHP 매뉴얼을 참조하십시오.


8

PHP end()는 변경하고자하는 것 (변수 일 수 있음)에 대한 참조를 기대 하기 때문에 불평 합니다. 그러나 먼저 결과를 변수에 저장하지 않고 explode()직접 결과를 전달합니다 end(). 현재 explode()값을 반환 할 때 값은 메모리에만 존재하며 변수를 가리 키지 않습니다. 존재하지 않는 무언가 (또는 메모리에 알려지지 않은 것)에 대한 참조를 작성할 수 없습니다.

또는 다른 말로하면 : PHP는 당신이 그에게주는 값이 직접 값이거나 값에 대한 포인터인지 알지 못합니다 (포인터는 변수 (정수)이며 메모리의 오프셋을 저장합니다. 실제 값은 거주). 따라서 PHP는 항상 포인터 (참조)를 기대합니다.

그러나 이것은 PHP 7에서 여전히 고지 사항이므로 (더 이상 사용되지 않음) 고지 사항에 대해 오류보고를 완전히 비활성화하지 않고 고지 사항을 무시하고 ignore-operator를 사용할 수 있습니다.

$file_extension = @end(explode('.', $file_name));

3
@OskarCalvo 저의 철학이기도합니다. 그러나 이것은 오류가 아닙니다. PHP는이를 "통지"로 취급합니다. 그리고 그것은 다른 답변에 대한 대안 "솔루션"이었습니다. 더 좋은 방법은 explode다른 사람들이 여기에 쓴 것처럼 임시 변수에 값을 저장하는 것입니다. 그러나 다시 : 이것은 오류가 아니므로이 연산자를 사용해도됩니다. PHP는 일반적으로 오류 처리에 좋지 않습니다. 그러므로 내가 사용 제안 set_error_handlerset_exception_handler오류 처리와 깨끗한 솔루션으로.
마법사

4

배열을 즉시 인덱싱 할 수없는 것처럼 end를 호출 할 수도 없습니다. 변수에 먼저 할당 한 다음 end를 호출하십시오.

$basenameAndExtension = explode('.', $file_name);
$ext = end($basenameAndExtension);

4

end(...[explode('.', $file_name)])PHP 5.6부터 사용되었습니다. PHP 문서 자체는 아니지만 RFC에 문서화되어 있습니다.


2

10 년 이상 플래그를 올리지 만 제대로 작동하고 예상 값을 반환하므로 작은 stfu 연산자 는 모두 당신이 찾고있는 가장 좋은 나쁜 습관입니다.

$file_extension = @end(explode('.', $file_name));

0

PHP 공식 매뉴얼 : end ()

매개 변수

array

배열입니다. 이 배열은 함수에 의해 수정되므로 참조로 전달됩니다. 따라서 실제 변수 만 참조로 전달 될 수 있으므로 배열을 반환하는 함수가 아니라 실제 변수를 전달해야합니다.


3
공식 매뉴얼에서 인용하십시오. 손으로 다시 쓰지 마십시오. 또한 기존 답변보다 더 나은 답변을 만들어보십시오.
Victor Polevoy

-1

먼저, 이와 같은 변수에 값을 저장해야합니다

$value = explode("/", $string);

그런 다음 end 함수를 사용하여 다음과 같은 배열에서 마지막 인덱스를 가져올 수 있습니다

echo end($value);

나는 그것이 당신을 위해 작동하기를 바랍니다.


-3

$ file_extension = 끝 (explode ( '.', $ file_name)); //이 라인의 오류

이 줄을 다음과 같이 변경하십시오.

$ file_extension = end ( (explode ( '.', $ file_name)) ); // 오류 없음

간단한 테크닉을 위해 브라켓을 하나 더 넣으십시오.

(explode ()) 이면 독립적으로 수행 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.