0

この質問についてよく調べましたが、適切な解決策が見つかりませんでした。

私が持っているのは、アルバム カバーを使用したいくつかの画像です。それらをクリックすると、アルバムからランダムな曲が引き出されます。アルバムは 01 ~ 05 で、ジャケット画像が含まれています。クリックするsong = "<?php echo (random_song("album_number")); ?>";と、 id の div に埋め込まれた呼び出しが呼び出されます#player

PHP:

<?php
 function random_song($dir) {
  $files = array (
   (array) glob('01/*.mp3'),
   (array) glob('02/*.mp3'),
   (array) glob('03/*.mp3'),
   (array) glob('04/*.mp3'),
   (array) glob('05/*.mp3')
  );

  $set = substr($dir,0,2) - 1;
  shuffle($files[$set]);
  $key = array_rand($files[$set]);
  $file = $files[$set][$key];
  return $file;
 }
?>

これまでのところ、曲を再生することができました。ただし、別の曲を選択することはありません。1 つのアルバムをクリックすると、曲が選択されます。2 番目のものをクリックすると、曲が再生されます。最初の曲をクリックして戻すと、同じ曲が再生されます。

shuffle()ご覧のとおり、追加してみましたが、違いはありません。また、それが機能していることを確認するためにvar_dump()、のすべての部分で実行しました。問題はありませんでした。$filesglob()

私は立ち往生しています。私は何をする必要がありますか?


解決:

Fritz van Campen の言ったことは正しかった: php は 1 回だけ呼び出される。に書き込まれ、<script>解析されるとすぐに呼び出されるため、各アルバムは元々コード化されていた曲のみを呼び出しました。彼が提案したように、私がする必要があったのは、ソング ピッカーを JavaScript に移行することでした。私の解決策:

var songs = <?php echo json_encode($files); ?>;
...
var set = parseInt(dir.substr(0,2))-1;
var song = songs[set][Math.floor(Math.random() * songs[set].length)];

...これは、php によって作成された配列を JavaScript に転送し、同じシステムを使用してランダムな曲を選択します。

答えてくれてありがとう!

4

2 に答える 2

0

PHPに、値を1回だけ選択してランダムにするように要求しています。あなたが使用しているもう 1 つの言語、JavaScript は何ですか? その場合は、ランダム ソング ピッカーを JavaScript に移動します。

PHPはサーバー上で実行されます。JavaScript はブラウザで実行されます。サーバーが HTML ページを返すと、PHP は完了し、再び実行されることはありません。

于 2013-03-27T18:07:00.367 に答える
0

Solution 1 = Server Side

I am assuming clicking the album sends a new query for a new page that has the random song off the album you clicked. I am also assuming you have a tree structure like:

Albums/
  01/
    Track01.mp3
    Track02.mp3
    Track03.mp3
    ...
  02/
  03/
  ...

I would have the link include the album number to the album and pass that to $dir. Then just glob that directory. Once I have an array of filenames I use array_rand to pull out a random filename.

<?php
  function random_song($dir) {
    $root = "Albums/"
    if(is_dir($root.$dir)){
      $songs = glob($root.$dir.'/*.mp3');
      return $root.$dir.array_rand($songs);
    }
    //Error
  }
?>

Solution 2 - Client Side If the page isn't reloading every time the album image is clicked I would include a ul in the album image div with display:none; and in each li have the path to each song. Then when the album div was clicked I would use JQuery choose a random child li (example here) and read the contents of the li and pass that string to the player.

于 2013-03-27T20:00:04.893 に答える