PHP array_rand总是返回相同的

时间:2013-03-27 18:04:39

标签: php multidimensional-array

我已经研究了很多这个问题,但还没有找到合适的解决方案。

我所拥有的是使用专辑封面的一些图像,当您点击它们时,我想要从专辑中随机播放一首歌。专辑是01-05,他们的封面图片都在其中。点击后,他们会调用song = "<?php echo (random_song("album_number")); ?>";,然后将其嵌入ID为#player的div中。

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,并使用相同的系统选择随机歌曲。

感谢您的回答!

2 个答案:

答案 0 :(得分:0)

你只是要求PHP选择一次随机值。您正在使用的其他语言是什么,JavaScript?如果是这样,请将随机歌曲选择器移动到JavaScript。

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

答案 1 :(得分: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中包含一个带有display:none;的ul,并且在每个li中都有每首歌曲的路径。然后当点击专辑div时,我会使用JQuery选择一个随机子li(example here)并读取li的内容并将该字符串传递给播放器。