php - 当分隔符有效时,explode() 偏移量和分隔符警告
问题描述
我有一段时间试图弄清楚发生了什么。我有一段代码会引发一些错误。在警告和通知之外,代码工作正常并且数组不为空。但是为什么我会收到这些警告和通知很麻烦。在我的测试环境中,我没有收到错误,但是当放在不同的服务器上时,它们会立即弹出。我很困惑为什么。抛出错误的代码行和抛出的错误如下
$libTitle = explode($libYearRes[0], $value);
Notice: Undefined offset: 0
Warning: explode(): Empty delimiter
$sortLibYearRes = explode(' ', $libYearRes[0]);
Notice: Undefined offset: 0
$libMovieRes = $sortLibYearRes[1];
Notice: Undefined offset: 1
整个代码块如下,其中问题行用@表示
function checkMovieLibrary($movieTitle,$movieLibrary){
foreach ($movieLibrary as $value) {
preg_match('/\(\d\d\d\d\)\s\d\d\d*[Pp]/', $value, $libYearRes);
$libTitle = @explode($libYearRes[0], $value);
$libMovieTitle = rtrim($libTitle[0]);
$sortLibYearRes = @explode(' ', $libYearRes[0]);
//list($libMovieYear,$libMovieRes) = explode(' ', $libYearRes[0], 2);
$libMovieYear = $sortLibYearRes[0];
$libMovieRes = @$sortLibYearRes[1];
preg_match('/\(\d\d\d\d\)\s\d\d\d*[Pp]/', $movieTitle, $newfileYearRes);
$newFileTitle_array = explode($newfileYearRes[0], $movieTitle);
$newFileTitle = rtrim($newFileTitle_array[0]);
$sortFileYearRes = explode(' ', $newfileYearRes[0]);
$newFileMovieYear = $sortFileYearRes[0];
$newFileMovieRes = $sortFileYearRes[1];
if(stripos($libMovieTitle.' '.$libMovieYear, $newFileTitle.' '.$newFileMovieYear) !== false){
$moviesList_array[] = array('OriginalFile' => $value, 'NewFile' => $movieTitle);
return($moviesList_array);
}
}
return false;
}
//$movieTitle = "10 Cloverfield Lane (2016) 1080p.mkv"; //This is an example of $movieTitle string
//$movieLibrary = array('10 Cloverfield Lane (2016) 1080p.mkv','The Goonies (1985) 1080p.mp4'); this is an example of the $movieLibrary array
$doesMovieExist = checkMovieLibrary($Movie,$movieLibrary);
if(is_array($doesMovieExist) && $doesMovieExist !== false){
foreach($doesMovieExist as $fileKey => $fileValue) {
$originalFile = $fileValue['OriginalFile'];
$newFile = $fileValue['NewFile'];
}
//do some stuff here
}
解决方案
首先不要使用@,因为它会绕过错误消息。所以用户error_reporting(E_ALL)
直到开发阶段。
然后你得到未定义的偏移量,这意味着你的数组是空的,不存在所以设置一个条件来检查它是否存在然后爆炸应该工作。它必须是这样的:
if(!empty($libYearRes[0]) || isset($libYearRes[0])) {
$libTitle = @explode($libYearRes[0], $value);
}
推荐阅读
- c# - 通过 .net 核心上的模式添加/编辑记录
- java - 在浏览器中显示 RTSP H264 流的现代方式 (HTML5)
- outlook - 我可以使用 netoffice 包从 Web 应用程序自动化 Outlook 应用程序吗?有没有什么缺点
- git - 重新设置内容相同但哈希值不同的提交
- php - 有没有办法使用 PHPPresentation 创建带有虚线的折线图?
- python - 使用python 3的AES加密和解密
- c# - ASP.NET Core API - 动态路由(使 API 路由表现得像“单参数查询字符串”)
- mysql - MySQL 根据条件每行更新值行
- flutter - 我想在flutter中显示自定义进度对话框(类似于iOS默认对话框)
- c# - 通过 Selenium 查找元素时如何在 CssSelector 中使用通配符?