【问题标题】:Unable to get result while returning value from the function in PHP从 PHP 中的函数返回值时无法获得结果
【发布时间】:2020-10-28 22:00:42
【问题描述】:

我无法使用此 PHP 代码获得所需的结果。

我有一个名为 audio 的文件夹,其中有 2 个 mp3 文件,如图 Audio folder contents

我在 mp3 文件中保留了歌手姓名的简写形式,例如 RI 用于 RIHANA,MC 用于 MILEY CYRUS。

问题是我想要扫描音频文件夹并检查播放列表并根据所选播放列表和歌曲编号查找 mp3 文件的代码。然后它会以完整的形式显示可用的歌手姓名(我也为此做了一个单独的函数),但我无法获得歌手的完整姓名。它反复为名为 audio 的文件夹中可用的所有不同音频文件提供相同的歌手名称。它给出了准确的短名称,但不是全名。你可以在图片中看到。 Result of PHP code when executed

所以请帮帮我。

主要是我需要函数之外的结果。不像我所做的那样在里面。

issue


<?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
        );
    }

【问题讨论】:

  • if ($singershortname = "MC") 正在分配一个值。要进行比较,请使用两个或三个等号:if ($singershortname == "MC")。所以这里发生的情况是,您在第一个 if 中将值分配给“MC”,这将始终评估为 true(因为它是一个真实值)并且您的 elseifelse 将永远不会被执行。您还可以在比较 $singershortname 时传入 $shortname,所以它应该是:if ($shortname == 'MC')elseif ($shortname == 'RI')
  • 先生,您可以编辑函数并为我写清楚,确切的函数应该是什么。我没有得到你请.......问题是我需要一个函数,该函数为该函数从音频文件名为歌手姓名生成的短代码提供全名
  • 我只是在谈论你的函数singeractualname()。要为变量分配值,请执行$variable = 'value';(一个=)。要比较一个值,您可以使用$variable == 'value'(两个== 或三个===)。因此,在您的函数中的if-statements 中,您不是比较 变量与值,而是分配 变量一个值。此外,您的函数签名是 function singeractualname($shortname),这意味着它是您需要在函数中使用的 $shortname 变量,而不是 $singershortname
  • 谢谢先生!!它现在工作了:) 但是先生,我还想问一件事是如何生成一个带有这些歌手姓名的 html(带有指向 mp3 文件的超链接)??
  • 不确定我是否关注您,但如果问题是如何将名称作为文件链接获取,那么请执行以下操作:$singerfullname = '&lt;a href="link-to-mp3"&gt;Miley Cyrus&lt;/a&gt;';,其他艺术家也一样。如果您现在在页面上回显该变量,它将是一个链接。

标签: php function file directory glob


【解决方案1】:

如果您想返回找到的所有文件的列表,并且希望递归地浏览文件夹和子文件夹,则需要使用上面的代码来存储找到的所有文件的详细信息,这些文件可以返回从这个函数。与其尝试手动递归目录并维护找到的文件列表,不如考虑使用原生 PHP recursiveIterator 类型类之一。

如果歌曲的格式保持不变,您可能会考虑使用更简单的方法来标记文件名 - list 结合 explode 可以非常轻松地命名这些标记,并且您可以使用其中一个标记执行查找全名的查找。如果格式在艺术家/目录之间有所不同,regEx 会更灵活 - 但下面的模式可能需要相当大的改进;-)

# 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 />

【讨论】:

  • Rihanna
    php 在工作目录中生成带有文件位置的超链接。但实际上音频文件在 AUDIO 文件夹中。那么如何使它像 导航到主页
    这样用户就可以从那里返回主页,而无需按浏览器上的返回按钮
  • 先生,我不知道你从哪里得到这个结果??我只是用这段代码获得主页按钮
  • 如果您查看我发布的代码,它具有与我的系统相关的$root='c:/wwwroot';$dir='/sfx/mp3/tmp';...我认为您会考虑到这一点并进行编辑以适应您的环境。
  • 一切都很好,除了i.stack.imgur.com/vXx3U.png 我需要主页作为按钮而不是音频文件。我已经将代码修改为最新的请看一下
  • 在调用php函数之前手动添加首页链接?
猜你喜欢
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2021-04-21
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多