php - 从 PHP 中的函数返回值时无法获得结果
问题描述
我无法使用此 PHP 代码获得所需的结果。
我有一个名为 audio 的文件夹,其中有 2 个 mp3 文件,如图Audio 文件夹内容
我在 mp3 文件中保留了歌手的简短名称,例如 RI 用于 RIHANA,MC 用于 MILEY CYRUS。
问题是我想要扫描音频文件夹并检查播放列表并根据所选播放列表和歌曲编号查找 mp3 文件的代码。然后它将以完整的形式显示可用的歌手姓名(我也为此做了一个单独的函数),但我无法获得歌手的完整姓名。它反复为名为 audio 的文件夹中可用的所有不同音频文件提供相同的歌手名称。它给出了准确的短名称,但不是全名。你可以在图片中看到。PHP 代码执行时的结果
所以请帮我解决这个问题。
最重要的是我需要函数之外的结果。不像我所做的那样在里面。
<?php
# a slightly modified version of the original function
function singeractualname( $ssn ) {
switch( $ssn ){
case 'MC':return 'Miley Cyrus';
case 'RI':return 'Rihanna';
default:return 'Singer name not available !!!';
}
}
function outputFiles( $path, $song, $dir ){
$output=[];
if( file_exists( realpath( $path ) ) ){
$dirItr=new RecursiveDirectoryIterator( $path, RecursiveDirectoryIterator::KEY_AS_PATHNAME );
foreach( new RecursiveIteratorIterator( $dirItr, RecursiveIteratorIterator::CHILD_FIRST ) as $obj => $info ) {
if( $info->isFile() ){
$pttn=sprintf( '@%s-\w+\.\w+@i', $song );
preg_match( $pttn, $info->getFileName(), $col );
if( !empty( $col ) ){
foreach( $col as $file ){
$ext=pathinfo( $file, PATHINFO_EXTENSION );
list( $int, $cat, $code )=explode( '-', pathinfo( $file, PATHINFO_FILENAME ) );
$output[]=(object)[
'ext' => $ext,
'code' => $code,
'name' => singeractualname( $code ),
'file' => $dir . '/' . $info->getFileName(),
'index' => $int,
'category' => $cat
];
}
}
}
}
}
array_unshift( $output, (object)[
'ext' => 'html',
'code' => false,
'name' => 'Home',
'file' => '/homepage.html',
'index' => false,
'category' => false
]);
return $output;
}
$PlaylistName = 'ROCK';
$songNumber = 1;
$root='';
$dir='audio';
$path=$root . $dir;
$song=sprintf( '%s-%s', $songNumber, $PlaylistName );
$arr=outputFiles( $path, $song, $dir );
foreach( $arr as $obj ) {
printf(
'<link rel="stylesheet" type="text/css" href="audio/css/main.css"><div class="wrap-login100 p-l-85 p-r-85 p-t-55 p-b-55"><br><br><audio width="100%" height="100%" controls="controls" src="%1$s" controlslist="nodownload" type="audio/mp3" style="visibility: visible;">
</audio><br /><font size="4" color="#000080"><b>Singer : <font size="4" color="#B22222">%2$s</b></font></font></div>',
$obj->file,
$obj->name
);
}
解决方案
如果您想返回找到的所有文件的列表,并且希望递归地浏览文件夹和子文件夹,则需要使用上面的代码来存储可以从此函数返回的所有找到的文件的详细信息. 与其尝试手动递归目录并维护找到的文件列表,不如考虑使用本机 PHPrecursiveIterator
类型类之一。
如果歌曲的格式保持不变,您可能会考虑一种更简单的方法来标记文件名 -list
结合explode
允许非常容易地命名这些标记,并且使用这些标记之一,您可以执行查找以找到全名。如果格式在艺术家/目录之间有所不同, AregEx
会更加灵活 - 但下面的模式可能需要相当大的改进;-)
# a slightly modified version of the original function
function singeractualname( $ssn ) {
switch( $ssn ){
case 'MC':return 'Miley Cyrus';
case 'RI':return 'Rihanna';
default:return 'Singer name not available !!!';
}
}
function outputFiles( $path, $song, $dir ){
$output=[];
if( file_exists( realpath( $path ) ) ){
$dirItr=new RecursiveDirectoryIterator( $path, RecursiveDirectoryIterator::KEY_AS_PATHNAME );
foreach( new RecursiveIteratorIterator( $dirItr, RecursiveIteratorIterator::CHILD_FIRST ) as $obj => $info ) {
if( $info->isFile() ){
$pttn=sprintf( '@%s-\w+\.\w+@i', $song );
preg_match( $pttn, $info->getFileName(), $col );
if( !empty( $col ) ){
foreach( $col as $file ){
$ext=pathinfo( $file, PATHINFO_EXTENSION );
list( $int, $cat, $code )=explode( '-', pathinfo( $file, PATHINFO_FILENAME ) );
$output[]=(object)[
'ext' => $ext,
'code' => $code,
'name' => singeractualname( $code ),
'file' => $dir . '/' . $info->getFileName(),
'index' => $int,
'category' => $cat
];
}
}
}
}
}
array_unshift( $output, (object)[
'ext' => 'html',
'code' => false,
'name' => 'Home',
'file' => '/homepage.html',
'index' => false,
'category' => false
]);
return $output;
}
$PlaylistName = 'ROCK';
$songNumber = 1;
$root='c:/wwwroot';
$dir='/sfx/mp3/tmp';
$path=$root . $dir;
$song=sprintf( '%s-%s', $songNumber, $PlaylistName );
$arr=outputFiles( $path, $song, $dir );
foreach( $arr as $obj ) {
printf(
'<a href="%1$s" title="%2$s">%2$s</a><br />',
$obj->file,
$obj->name
);
}
输出将是
<a href="/homepage.html" title="Home">Home</a><br />
<a href="/sfx/mp3/tmp/1-ROCK-ACDC.mp3" title="Singer name not available !!!">Singer name not available !!!</a><br />
<a href="/sfx/mp3/tmp/1-ROCK-MC.mp3" title="Miley Cyrus">Miley Cyrus</a><br />
<a href="/sfx/mp3/tmp/1-ROCK-RI.mp3" title="Rihanna">Rihanna</a><br />
推荐阅读
- stanford-nlp - 对于不同的词性,相同的词有不同的引理吗?
- c++ - 使用 GCC 编译 Win32 EXE 时 PE 大小和部分不正确
- git - 如何将大文件添加到 Git 存储库?
- mysql - 选择当前周,从星期一开始而不是星期日
- javascript - 在 React Native 中将本地图像上传到 Firestore 和 Firebase 存储时如何解决“文件名太长”?
- jakarta-mail - 我应该如何使用 JavaMail 和 AWS 发送邮件
- node.js - mongoose.find() 返回未定义
- javascript - 为什么我的异步函数在我的 React 组件中显得非常笨拙?
- tensorflow - ImportError:没有名为“numpy.testing.nosetester”的模块
- compression - 位压缩(13 位寄存器中的两个 8 位)