如何在 PHP 中使用解码后的 JSON 数据?
How can I use decoded JSON data inside PHP?
使用 this 插件,我需要使用预渲染数据绘制音频波形。
我将 JSON 数据存储在 MySQL 中作为 {"sample_rate":44100,"samples_per_pixel":4410,"bits":8,"length":2668,"data":[0.13,0.19,0.15,0.11,0.13,0.13,0.24,0.35 ...]}
所以我尝试了:
PHP
$json = $row['wave'];
$json_array = json_decode($json);
$json_wave = implode(',', $json_array->data);
HTML
<div data-track-wave="'.$json_wave.'" id="play'.$row['id'].'" class="track"></div>
JS
function createWaveform(json) {
$( "#waveformbottom" ).empty();
var linGrad = document.createElement('canvas').getContext('2d').createLinearGradient(0,0,0,170);
linGrad.addColorStop(0, '#ff3b25');
linGrad.addColorStop(0.5, '#ff0018');
var wavesurferbottom = WaveSurfer.create({
container: document.querySelector('#waveformbottom'),
waveColor: '#b3b3b3',
progressColor: linGrad,
backend: 'MediaElement',
mediaType:'audio',
height:'48',
cursorColor:'#fff',
cursorWidth:'0',
normalize:true,
barWidth:'2'
});
//Set peaks ! THE PROBLEM !
wavesurferbottom.backend.peaks = [json];
//Draw peaks
wavesurferbottom.drawBuffer();
$(window).resize(function(){
if($(this).width() != width){
widthbottom = $(this).width();
wavesurferbottom.drawer.containerWidth = wavesurferbottom.drawer.container.clientWidth;
wavesurferbottom.drawBuffer();
}
});
}
$(document).on('click touchend', '.track', function(e) {
var wave_data = $(this).data('track-wave');
createWaveform(json);
e.preventDefault();
});
我的 wave_data
的调试表明它和 0.01,0.13,0.19,0.15,0.11,...
一样正确,但是没有绘制波形。
相反,如果我设置 wavesurferbottom.backend.peaks = [0.01,0.13,0.19,0.15,0.11,...];
它会起作用。
我不是 JSON 专家,我做错了什么?
不同之处在于,一个是字符串(无论如何都无效 JSON - 它只是一个逗号分隔的数字列表):
data-track-json="0.01,0.13,0.19,0.15,0.11"
var json = $(this).data('track-json'); // a string
还有一个是JS数组:
var x=[0.01,0.13,0.19,0.15,0.11];
一种简单的方法是将其拆分为 ,
- 这会将您的字符串转换为您需要的 JS 数组,如下所示:
var samples = $(this).data('track-json').split(','); // Renamed because it's not JSON
..
createWaveform(samples);
还值得注意的是,您将获得一个 字符串数组 而不是一个数字数组,但是许多 JS 库都可以处理它。如果您想走 JSON 路线,请确保您的属性包含方括号:
data-track-json="[0.01,0.13,0.19,0.15,0.11]"
要创建的 PHP 可能如下所示:
$json_wave = '['.implode(',', $json_array->data).']';
然后使用 JSON.parse 调用将其转换为合适的数字类型数组:
var samples = JSON.parse( $(this).data('track-json') );
如果您还想使用JSON
PHP
$json = $row['wave'];
$object = json_decode($json);
$json_wave = json_encode($object->data);
这是一个 JSON 字符串,大概类似于 [1,2,3,4]
HTML不变
<div data-track-name="'.$row['name'].'" data-track-id="'.$row['id'].'" data-track-json="'.$json_wave.'" id="play'.$row['id'].'" class="track song-play-btn playthistrack"></div>
JS 解析 JSON 您发现问题的地方
//Set peaks ! THE PROBLEM !
wavesurferbottom.backend.peaks = JSON.parse(json);
wavesurferbottom.backend.peaks
将是一个数字数组——大概是其余代码所期望的
使用 this 插件,我需要使用预渲染数据绘制音频波形。
我将 JSON 数据存储在 MySQL 中作为 {"sample_rate":44100,"samples_per_pixel":4410,"bits":8,"length":2668,"data":[0.13,0.19,0.15,0.11,0.13,0.13,0.24,0.35 ...]}
所以我尝试了:
PHP
$json = $row['wave'];
$json_array = json_decode($json);
$json_wave = implode(',', $json_array->data);
HTML
<div data-track-wave="'.$json_wave.'" id="play'.$row['id'].'" class="track"></div>
JS
function createWaveform(json) {
$( "#waveformbottom" ).empty();
var linGrad = document.createElement('canvas').getContext('2d').createLinearGradient(0,0,0,170);
linGrad.addColorStop(0, '#ff3b25');
linGrad.addColorStop(0.5, '#ff0018');
var wavesurferbottom = WaveSurfer.create({
container: document.querySelector('#waveformbottom'),
waveColor: '#b3b3b3',
progressColor: linGrad,
backend: 'MediaElement',
mediaType:'audio',
height:'48',
cursorColor:'#fff',
cursorWidth:'0',
normalize:true,
barWidth:'2'
});
//Set peaks ! THE PROBLEM !
wavesurferbottom.backend.peaks = [json];
//Draw peaks
wavesurferbottom.drawBuffer();
$(window).resize(function(){
if($(this).width() != width){
widthbottom = $(this).width();
wavesurferbottom.drawer.containerWidth = wavesurferbottom.drawer.container.clientWidth;
wavesurferbottom.drawBuffer();
}
});
}
$(document).on('click touchend', '.track', function(e) {
var wave_data = $(this).data('track-wave');
createWaveform(json);
e.preventDefault();
});
我的 wave_data
的调试表明它和 0.01,0.13,0.19,0.15,0.11,...
一样正确,但是没有绘制波形。
相反,如果我设置 wavesurferbottom.backend.peaks = [0.01,0.13,0.19,0.15,0.11,...];
它会起作用。
我不是 JSON 专家,我做错了什么?
不同之处在于,一个是字符串(无论如何都无效 JSON - 它只是一个逗号分隔的数字列表):
data-track-json="0.01,0.13,0.19,0.15,0.11"
var json = $(this).data('track-json'); // a string
还有一个是JS数组:
var x=[0.01,0.13,0.19,0.15,0.11];
一种简单的方法是将其拆分为 ,
- 这会将您的字符串转换为您需要的 JS 数组,如下所示:
var samples = $(this).data('track-json').split(','); // Renamed because it's not JSON
..
createWaveform(samples);
还值得注意的是,您将获得一个 字符串数组 而不是一个数字数组,但是许多 JS 库都可以处理它。如果您想走 JSON 路线,请确保您的属性包含方括号:
data-track-json="[0.01,0.13,0.19,0.15,0.11]"
要创建的 PHP 可能如下所示:
$json_wave = '['.implode(',', $json_array->data).']';
然后使用 JSON.parse 调用将其转换为合适的数字类型数组:
var samples = JSON.parse( $(this).data('track-json') );
如果您还想使用JSON
PHP
$json = $row['wave'];
$object = json_decode($json);
$json_wave = json_encode($object->data);
这是一个 JSON 字符串,大概类似于 [1,2,3,4]
HTML不变
<div data-track-name="'.$row['name'].'" data-track-id="'.$row['id'].'" data-track-json="'.$json_wave.'" id="play'.$row['id'].'" class="track song-play-btn playthistrack"></div>
JS 解析 JSON 您发现问题的地方
//Set peaks ! THE PROBLEM !
wavesurferbottom.backend.peaks = JSON.parse(json);
wavesurferbottom.backend.peaks
将是一个数字数组——大概是其余代码所期望的