PHP无法控制播放顺序,因音频播放由前端决定;PHP仅负责生成并返回已排序的完整列表,前端必须严格按该顺序加载和播放,避免异步竞态、二次排序或依赖DOM顺序。
PHP 本身不参与音频播放逻辑,所谓“播放优先级”实际由前端播放器(如 HTML5 、第三方 JS 插件如 Howler.js、或原生 App SDK)决定。PHP 的角色仅限于:生成播放列表、提供元数据、返回排序后的书目数组。如果你在 PHP 层调用 usort() 或 array_multisort() 排好了数组,但前端仍乱序播放,问题一定出在前端没按 PHP 返回的顺序渲染或加载。
关键不是“设置优先级”,而是确保前端按 PHP 排好序的结构加载音频。常见错误是前端用异步请求逐个拉取单本书,导致竞态和顺序丢失。

id、url、title、priority(可选),且顺序严格对应播放顺序.sort(),尤其避免用时间戳或随机数二次排序load() 和 play(),而非依赖 DOM 元素自然顺序audio.play() —— 浏览器会阻塞或拒绝自动播放,应统一由队列控制器调度假设你从数据库查出听书记录,需按业务规则稳定排序:
$books = [
['id' => 101, 'title' => '三国演义', 'url' => '/audio/sanguo.mp3', 'priority' => 2, 'updated_at' => '2025-03-15'],
['id' => 102, 'title' => '红楼梦', 'url' => '/audio/honglou.mp3', 'priority' => 1, 'updated_at' => '2025-04-01'],
['id' => 103, 'title' => '西游记', 'url' => '/audio/xiyou.mp3', 'priority' => 1, 'updated_at' => '2025-02-20'],
];
usort($books, function($a, $b) {
if ($a['priority'] !== $b['priority']) {
return $a['priority'] <=> $b['priority']; // 升序:数字小的优先
}
return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); // 同 priority 时,新更新的靠前
});
// 输出给前端时保持索引连续(不保留原始键)
echo json_encode(array_values($books), JSON_UNESCAPED_UNICODE);
iOS 上 标签即使按顺序写死,也不保证按 DOM 顺序触发 canplaythrough 事件。这意味着你监听第一个音频就跳第二个,极易错乱。
标签的 DOM 顺序来实现队列 + JS 手动切换 src,并在 onended 回调里加载下一个audio.load(),否则 iOS 可能卡在 stalled 状态