Я много исследовал этот вопрос, но не нашел подходящего решения.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, и использует ту же систему, чтобы выбрать случайную песню.
Благодарим вас за ответ!
Я вызываю PHP каждый раз, когда нажимается альбом. Сжатие альбома src' (с момента смены альбомов), и оттуда вызывается php для возврата случайно выбранной песни. Он может работать для каждого альбома, но не возвращает другую песню _per album_. Он работает каждый раз, но по какой-то причине всегда возвращает тот же ключ, несмотря на перетасовку. –
Нет, это не так. Ты думаешь, что да, но ты не такой. Infact, вы не можете, потому что это невозможно. PHP является серверной, а не клиентской. – Halcyon
Если нет, то почему я могу назвать его для каждого альбома отдельно и он все еще работает? –