2013-03-27 4 views
0

Я много исследовал этот вопрос, но не нашел подходящего решения.PHP array_rand всегда возвращает то же самое

У меня есть несколько изображений с обложками альбомов, и когда вы нажимаете на них, мне нужна случайная песня из альбома, которую нужно вытащить. Альбомы 01-05, и их обложки находятся в них. При щелчке они вызывают song = "<?php echo (random_song("album_number")); ?>";, который затем встроен в 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() работает; проблем не было.

Я застрял. Что мне нужно сделать?


Решение:

Что Фриц ван Campen сказал было правильным: РНР вызывается только один раз. Это было написано в <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, и использует ту же систему, чтобы выбрать случайную песню.

Благодарим вас за ответ!

ответ

0

Вы только просите PHP выбрать и случайное значение один раз. Какой другой язык вы используете, JavaScript? Если это так, переместите произвольный выбор песен на JavaScript.

PHP работает на сервере. JavaScript работает в браузере. Как только сервер вернет HTML-страницу, PHP будет выполнен и не будет работать снова.

+0

Я вызываю PHP каждый раз, когда нажимается альбом. Сжатие альбома src' (с момента смены альбомов), и оттуда вызывается php для возврата случайно выбранной песни. Он может работать для каждого альбома, но не возвращает другую песню _per album_. Он работает каждый раз, но по какой-то причине всегда возвращает тот же ключ, несмотря на перетасовку. –

+0

Нет, это не так. Ты думаешь, что да, но ты не такой. Infact, вы не можете, потому что это невозможно. PHP является серверной, а не клиентской. – Halcyon

+0

Если нет, то почему я могу назвать его для каждого альбома отдельно и он все еще работает? –

0

Решение 1 = сторона сервера

Я предполагаю, нажав альбом посылает новый запрос на новую страницу, которая имеет случайную песню с альбома вы щелкнули. Я также предполагаю, что вы имеете древовидную структуру, как:

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

Я бы ссылку включить номер альбома к альбому и передать до $ реж. Затем просто закройте этот каталог. Когда у меня есть массив имен файлов, я использую 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; и в каждом Ли есть путь к каждому песня.Затем, когда щелкнул альбом div, я использовал JQuery для выбора случайного дочернего li li (example here) и прочитал содержимое li и передал эту строку игроку.

+0

Это то, что я делаю - проблема в том, что 'array_rand' только когда-либо дает мне одну песню. Он не выбирает другой, если я снова вызову функцию. Если я перезагружу страницу, она будет выбирать другую песню для каждого альбома, но это всегда будет песня. Если я снова нажму на альбом, он не выберет другую песню: она продолжит воспроизведение песни, которую она выбрала в первый раз. –

+0

вы можете попробовать '$ songs = shuffle ($ songs); return $ song [0]; 'Также вы можете запрограммировать цикл перетасовки только для проверки. Возможно, ваш сервер не будет изменять случайное семя перед перемещением. Результат в той же последовательности случайных значений каждый раз, когда вы запускаете тест. –

+0

также о 'return $ root. $ Dir. $ Songs [mt_rand (0, count ($ songs)];'? –

Смежные вопросы