簡體   English   中英

PHP array_rand總是返回相同

[英]PHP array_rand always returning the same

我已經研究了很多這個問題,但是還沒有找到合適的解決方案。

我只有幾張使用專輯封面的圖像,當您單擊它們時,我希望從專輯中隨機提取一首歌曲。 專輯為01-05,封面圖像在其中。 單擊后,他們將song = "<?php echo (random_song("album_number")); ?>";稱為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() ,但是並沒有改變。 我還對$files每個部分都做了一個var_dump() ,以確保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,並使用相同的系統選擇隨機歌曲。

感謝您的回答!

您只要求PHP選擇和隨機值一次。 您正在使用的其他語言是JavaScript? 如果是這樣,請將隨機歌曲選擇器移至JavaScript。

PHP在服務器上運行。 JavaScript在瀏覽器中運行。 服務器返回HTML頁面后,PHP完成,將不再運行。

解決方案1 ​​=服務器端

我假設單擊專輯會發送一個新查詢,詢問新頁面是否包含您單擊的專輯中的隨機歌曲。 我還假設您有一個像這樣的樹結構:

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

我希望鏈接包含專輯編號到專輯,然后將其傳遞給$ dir。 然后只是遍歷該目錄。 一旦有了文件名數組,就可以使用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-客戶端如果如果每次單擊相冊圖像時頁面都沒有重新加載,則我將在ulul相冊圖像div中包含ul,其display:none; 每個李中都有通往每一首歌的道路。 然后,當單擊專輯div時,我將使用JQuery選擇一個隨機的子li( 此處為示例 ),並讀取li的內容並將該字符串傳遞給播放器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM