// 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天后仍然卡住。
#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()),然后它才能独立执行。.
评论
更好的解释vijayasankarn.wordpress.com/2017/08/28/…