// 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'
);


有什么想法吗? 2天后仍然卡住。

评论

更好的解释vijayasankarn.wordpress.com/2017/08/28/…

#1 楼

explode的结果分配给变量,然后将该变量传递给end

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


问题是end需要引用,因为它修改了内部的表示形式数组(即,它使当前元素指针指向最后一个元素)。

explode('.', $file_name)的结果不能转换为引用。这是PHP语言中的一个限制,出于简化的原因可能存在。

评论


非常感谢解决了我的问题。

–弗兰克·纳沃科(Frank Nwoko)
2011年1月8日在21:33

@Oswald,我们可以使用error_reporting关闭警告。这样做安全吗?

–起搏器
2014年12月9日在11:48

关闭error_reporting是安全的。盲目地忽略错误是不安全的。关闭error_reporting是朝着盲目忽略错误迈出的重要一步。在生产环境中,请改为关闭display_errors,然后将错误写入日志文件。

–奥斯瓦尔德
2014-12-10 23:08



不工作下面的答案-双括号-有效。

–贝贝
16-10-29在14:38

谢谢,为我省了很多时间!

–西蒙
17年8月10日在9:32

#2 楼

Php 7兼容的正确用法:

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

echo $fileExtension;
// jpg


评论


奇怪的。那行得通,但是如何呢?它是否抑制警告,类似于@前缀?

–奈杰尔·奥尔德顿(Nigel Alderton)
2014年2月5日在15:31



那么,为什么要添加额外的括号来消除错误呢?

–奈杰尔·奥尔德顿(Nigel Alderton)
2014年3月18日,0:53

我研究了这个怪癖,这似乎是一个错误吗?使用php解析器,其中双括号“(())”导致引用被转换为纯值。有关此链接的更多信息。

– Callistino
2014年4月1日在17:22

我喜欢这个..但我不同时喜欢。谢谢你毁了我的日子:-)

–billynoah
15年8月4日在23:37

在php7中仍会发出警告。 php.net/manual/en/…

– kosta
16-09-30在8:28



#3 楼

其他人都已经给了您您出错的原因,但是这是做您想做的最好的方法:
$file_extension = pathinfo($file_name, PATHINFO_EXTENSION);

评论


我同意。如果您有适当的API,使用字符串操作来解析文件路径毫无意义。

–gd1
2014年1月7日在7:43



#4 楼

将数组从explode()保存到一个变量,然后在此变量上调用end():

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


btw:我使用以下代码来获取文件扩展名:

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


其中strrchr在最后一个.substr切断.之后提取字符串

#5 楼

试试看:

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


原因是end的参数是通过引用传递的,因为end通过将其内部指针前进到最后一个元素来修改数组。如果您不传入变量,则没有指向该变量的引用。

有关更多信息,请参见PHP手册中的end

#6 楼

PHP抱怨,因为end()期望引用要更改的内容(只能是变量)。但是,您可以将explode()的结果直接传递给end(),而无需先将其保存到变量中。当explode()返回您的值时,它仅存在于内存中,没有变量指向它。您不能创建不存在的某些内容(或内存中未知的内容)的引用。换句话说:PHP不知道,如果您给他的值是直接值或只是指向该值的指针(指针也是一个变量(整数),用于存储实际值所在的内存的偏移量)。因此,PHP在这里总是希望有一个指针(引用)。

但是由于这仍然只是PHP 7中的一个通知(甚至不建议弃用),因此您可以省去忽略通知并使用ignore-operator而不是完全使用停用通知的错误报告:

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


评论


@OskarCalvo这也是我的理念。但这不是错误-PHP将其视为“通知”。这是这里其他答案的替代“解决方案”,没有人直接提及。更好的方法是将explode的值保存到一个临时变量中,就像其他人在这里写的一样。但是再次:这不是错误,因此可以使用此运算符。 PHP通常不好处理错误。因此,我建议使用set_error_handler和set_exception_handler进行错误处理并作为最干净的解决方案。

–向导
16 Dec 4'在12:57

#7 楼

正如您无法立即为数组建立索引一样,您也无法对其调用end。首先将其分配给变量,然后调用end。

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


#8 楼

end(...[explode('.', $file_name)])自PHP 5.6起开始工作。 RFC中对此进行了记录,尽管PHP文档本身中没有。

#9 楼

由于它会升旗超过10年,但可以正常工作并返回期望值,因此,一个stfu运算符是您一直在寻找的最好的坏习惯:

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


#10 楼

PHP官方手册:
end()

参数

array


数组。该数组通过引用传递,因为它已由函数修改。这意味着您必须传递给它一个实变量,而不是一个返回数组的函数,因为只有实际的变量可以通过引用传递。

评论


请从官方手册中引用报价,请勿自行重写。另外,请考虑使您的答案比现有答案更好。

– Victor Polevoy
15年8月8日在7:59

#11 楼

首先,您必须将值存储在这样的变量中

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


然后您可以使用end函数从这样的数组中获取最后一个索引

echo end($value);


我希望它对您有用。

#12 楼


$ file_extension = end(explode('。',$ file_name)); //此行错误

将此行更改为,

$ file_extension = end((explode('。',$ file_name)));; //没有错误

技术很简单,请再放一个括号进行爆炸,

(explode()),然后它才能独立执行。.