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

到目前为止,我已经让它播放了一首歌曲;但是,它从不选择另一首歌曲。如果我点击一张专辑,它会选择一首歌;单击第二个,它将播放一首歌曲。单击第一个,它会播放同一首歌曲。

shuffle()如您所见,我已尝试添加,但并没有什么不同。我还var_dump()对每个部分进行了$files检查以确保其glob()正常工作;没有问题。

我被困住了。我需要做什么?


解决方案:

Fritz van Campen 所说的是正确的:php 只被调用一次。它被写入<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 选择一次随机值。你使用的另一种语言是什么,JavaScript?如果是这样,请将随机歌曲选择器移至 JavaScript。

PHP 在服务器上运行。JavaScript 在浏览器中运行。一旦服务器返回 HTML 页面,PHP 就完成了,不会再次运行。

于 2013-03-27T18:07:00.367 回答
0

解决方案 1 = 服务器端

我假设单击专辑会发送一个新页面的新查询,其中包含您单击的专辑中的随机歌曲。我还假设您有一个树结构,例如:

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

我会让链接包含专辑的专辑编号并将其传递给 $dir。然后只需 glob 该目录。一旦我有了一个文件名数组,我就使用 array_rand 来提取一个随机文件名。

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

解决方案 2 - 客户端 如果每次单击专辑图片时页面都没有重新加载,我会在专辑图片 div 中包含一个 ul,display:none;每个 li 中都有每首歌曲的路径。然后,当单击专辑 div 时,我将使用 JQuery 选择一个随机子 li(此处为示例)并读取 li 的内容并将该字符串传递给播放器。

于 2013-03-27T20:00:04.893 回答