首页 > 解决方案 > 从 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
        );
    }

标签: phpfunctionfiledirectoryglob

解决方案


如果您想返回找到的所有文件的列表,并且希望递归地浏览文件夹和子文件夹,则需要使用上面的代码来存储可以从此函数返回的所有找到的文件的详细信息. 与其尝试手动递归目录并维护找到的文件列表,不如考虑使用本机 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 />

推荐阅读