0

私はPHPを初めて使用し、現在このWebページで作業しています。このページでは、フォルダー内の多数のオーディオファイルを読み取り、ユーザーが聞いたことについてのトランスクリプトを作成できます。現時点では、ディレクトリ内のファイルを読み取って、その配列をシャッフルできます。また、ユーザーが次/前のファイルをリッスンできるようにする2つのボタンを実装したかったのです。それは私が今問題を抱えているところです。次のボタンは機能しているようですが、私が望むようには機能していません。問題は、ポインタを1回だけ移動できることです。つまり、最初のファイルから2番目のファイルに移動でき、それ以上進むことはできません。ユーザーがボタンをクリックしたときに呼び出される関数のコードは次のとおりです。functionnextelem(){

            var nextElement = "./Sound data/<?php


            $current_id = current($files);
            $current_index = array_search($current_id, $files);     
            $next_index = $current_index+1;

            echo $files[$next_index];

            next($files);

            ?>";

            //Play the next file
            document.getElementById('RandomAudio').src=nextElement;


          }

問題は、current($ array)関数とnext($ array)関数が値による原則に従って機能することであると推測しています。したがって、関数が呼び出されるたびに、元の配列のコピーが渡されるため、ボタンを押すたびにクリックすると、現在の要素として最初の要素が取得され、next($ array)でポインタを移動しても実際には効果がありません。

だから私は自分のcurrent($ array)とnext($ array)関数を書いてみました:

        <?php
               function &current_by_ref(&$arr) {
                    return $arr[key($arr)];
                }
                function &next_by_ref(&$arr) {
                    return $arr[key($arr)+1];
                }
        ?>;

しかし、これらも役に立ちませんでした。ヘルプやヒントをいただければ幸いです。これは私の神経質になり始めています。(追記:(同じプロジェクトですが同じ問題ではありません)に関するトピックを開きましたが、それは本当に役に立ちました。リンクはここにありますPHP next($ array)とJavascript。すべてのコードをそこに投稿しました。これが最後ではありません。私が現在取り組んでいるバージョンですが、それは私が思うページについてのより多くのアイデアをあなたに与えることができます。とにかくありがとう)

フレオンの答えに基づいて、私はコードを次のように変更しました:

               session_start();
                $dir = './Sound data';
                $files = scandir($dir); 


                    $norp = $_GET['name'];  

                    $current_id = current($files);
                    $current_index = array_search($current_id, $files);     
                    $_SESSION['current'] = $current_index;
                    $_SESSION['songlist'] = $files;

                    $current_song = $_SESSION['current']; //index in songlist for your song
                    $songlist = $_SESSION['songlist']; //this session var has your $files array
                    if($norp == 'nextS'){

                        $current_song++; //changes currentsong to next song
                        if($current_song == count($songlist))
                           $current_song = 0;
                        echo "./Sound data/$songlist[$current_song]";
        }           

                    else if($norp == 'prevS'){
                        $current_song--;     //changes currentsong to prev song

                        if($current_song == count($songlist))
                        $current_song = 0;
                        echo "./Sound data/$songlist[$current_song]";
                    }

?>

    <script language="JavaScript" type="text/javascript" >

        function getNextSong()
        {                 
            $.get('getsong.php', {name : 'nextS'}, function(song){

                document.getElementById('RandomAudio').src =  song;
                document.getElementById('filename').innerHTML= song;
            //  alert(song);
            });
        }

        function getPreviousSong()
        {                 
            $.get('getsong.php', {name : 'prevS'}, function(song){

                document.getElementById('RandomAudio').src =  song;
                document.getElementById('filename').innerHTML= song;
            //  alert(song);
            });
        }
    </script>

しかし、私はまだすぐ次の要素を超えて到達することはできません。私は何か間違ったことをしていますか?

4

1 に答える 1

2

PHPとJavaScriptを混在させています。あなたはそれをすることはできません。コードが解釈され、次のファイルのみが使用可能になります。おそらくあなたの出力は次のとおりです。

var nextElement = "./Sound data/2.mp3";
   document.getElementById('RandomAudio').src=nextElement;

2回目にボタンを押すと、同じコードが実行されます。そのため、これ以上先に進むことはできません。サーバーから次のオーディオを取得する方法を見つける必要があります。そのためには、現在再生中のオーディオを追跡する必要があります。

getong.php

<?php
session_start(); //init session

if(!isset($_SESSION['songlist']) or empty($_SESSION['songlist']))
{ //we'll create our songlist JUST ONCE, when it's not created yet. And then, we'll put this list in a SESSION, so we can access it later.
    $dir = './Sound data';
    $files = scandir($dir);
    $_SESSION['songlist'] = array();
    foreach($files as $file)
    {//loop through song list and just add actual files, disposing "." and ".."
        if(is_file($file) and $file != "." and $file != "..")
        {
            $_SESSION['songlist'][] = $file; //add $file to songlist array.
        }
    }
    shuffle($_SESSION['songlist']);//shuffle list
    $_SESSION['current'] = 0; //iniate current song with first song in the list.
}//note that we'll create and shuffle the song list just once.

$norp = $_GET['name'];

$current_song = $_SESSION['current']; //index in songlist for your song
$songlist = $_SESSION['songlist']; //this session var has your $files array

if($norp == 'nextS'){
    $current_song++; //changes currentsong to next song
    if($current_song == count($songlist)) //if current is after the last element, set it to the first song
        $current_song = 0;
    echo "./Sound data/$songlist[$current_song]";
}
else if($norp == 'prevS'){
    $current_song--;     //changes currentsong to prev song
    if($current_song == -1) //if current is before the fist song, set it to the last song
        $current_song = count($songlist) - 1;

    echo "./Sound data/$songlist[$current_song]";
}

$_SESSION['current'] = $current_song; //store current song for later use.
?>

listensong.php //page that plays your songs(コード最適化あり)

<script type="text/javascript">
    //using jQuery
    function getSong(type)
    {
        $.get('getsong.php', {name: type}, function(song){
            document.getElementById('RandomAudio').src = song;
            document.getElementById('filename').innerHTML= song;
        });
    }
</script>
<a href="javascript:getSong('prevS')">Previous Song</a>
<a href="javascript:getSong('nextS')">Next Song</a>
于 2012-11-01T17:19:23.520 に答える