iT邦幫忙

0

PHP抓取SQL資料 將資料分組後抓取且能轉為JSON格式的方法

  • 分享至 

  • xImage

各位大神好~
我想要以PHP抓取SQL的值,
並依照設定條件分類加總個數,
但我將資料分組後值都會覆蓋前一項,
若使用陣列裝值可以成功抓取卻沒辦法轉存成JSON值,所以圖表都沒辦法顯示...
而這個JSON值是想要放在echarts圖表中的!
這樣說有點抽象,以下附上我的資料表與PHP~

1.資料表(資料表名稱為average_view)
https://ithelp.ithome.com.tw/upload/images/20210916/20142079eMbFtUcCcb.png

2.PHP(counta~counte是想用來存放各個條件分類的加總個數,anamearray~enamearray是想裝符合條件分類的name,目前先用陣列裝資料,但輸出的資料都沒辦法轉存成正確的JSON值)

<?php

        header("Content-type=text/json;charset=utf-8");
        $conn=mysqli_connect("localhost", "root","","資料庫名稱");

        $data = array();
        
        class User{  
            public $counta=0;
            public $countb=0;
            public $countc=0;
            public $countd=0;
            public $counte=0;
            public $anamearray= array();
            public $bnamearray= array();
            public $cnamearray= array();
            public $dnamearray= array();
            public $enamearray= array();
        }

         $sql = "SELECT average,name FROM average_view";
         
         $result = $conn->query($sql);
         if ($result->num_rows > 0) 
         {
            $user = new User();
             while($row = $result->fetch_assoc()) 
             {
                
                if($row['average']<=20)
                {
                    $user->counta=$user->counta+1;
                    $user->cnamearray[]=$row['name'];
                }
                else if($row['average']<=40) 
                {
                    $user->countb=$user->countb+1;
                    $user->cnamearray[]=$row['name'];
                }
                else if($row['average']<=60) 
                {
                    $user->countc=$user->countc+1;
                    $user->cnamearray[]=$row['name'];
                }
                else if($row['average']<=80) 
                {
                    $user->countd=$user->countd+1;
                    $user->dnamearray[]=$row['name'];
                }
                else
                {
                    $user->counte=$user->counte+1;
                    $user->enamearray[]=$row['name'];
                }
            }
            $data[] = $user;
        } 
        else 
        {
            echo "0 results";
        }

        $conn->close();
        echo json_encode($data);

?>

3.目前的JSON資料
https://ithelp.ithome.com.tw/upload/images/20210916/201420792I0TcboUqo.png

4.想要的JSON資料(我也不確定我這樣的資料可不可以用於echarts)

[
    {
        "counta": 0,
        "countb": 0,
        "countc": 1,
        "countd": 2,
        "counte": 2,
        "anamearray": [{}],
        "bnamearray": [{}],
        "cnamearray": [
            {
                "詹思婷"
            }
        ],
        "dnamearray": [
            {
                "陳國容",
                "蔡宜潔"
            }
        ],
        "enamearray": [
            {
                "洪白枝",
                "宋怡菁"
            }
        ,]
    }
]

5.目前echarts的圖表
https://ithelp.ithome.com.tw/upload/images/20210916/20142079LvahkJnSTN.png
(點選60-80那條進去後)
https://ithelp.ithome.com.tw/upload/images/20210916/20142079y7cs84MRIJ.png
我想要的結果是點進去能看見陳國容和蔡宜潔各自都有的長條圖

求求各位大神的幫忙了!!!謝謝~~

jouabcd iT邦新手 1 級 ‧ 2021-09-16 15:20:30 檢舉
.....
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
japhenchen
iT邦超人 1 級 ‧ 2021-09-16 14:10:32

花了一點時間去研究了一下echarts的官網...覺得是你想太多了

$userdata = ["80-100"=>[],"60-80"=>[],"40-60"=>[],"20-40"=>[],"0-20"=>[]];

$sql = "SELECT average,name FROM average_view";     
$result = $conn->query($sql);
if ($result->num_rows > 0) 
{
    while($row = $result->fetch_assoc()) 
    {
        if($row["average"]>80){
            array_push($userdata["80-100"],[$row["name"],$row["average"]]); 
            //把人跟平均分數加進去 
        }
        else if($row["average"]>60){
            array_push($userdata["60-80"],[$row["name"],$row["average"]]);
        }
        //下同....自己處理        
    }
}
echo json_encode($userdata); // 回傳給 javascript 所要的 json 
die();
exit();

https://echarts.apache.org/examples/zh/editor.html?c=bar-drilldown

又多學了一套charts,感恩啊!/images/emoticon/emoticon35.gif

japhenchen非常謝謝你~/images/emoticon/emoticon41.gif

japhenchen大神不好意思可以再問你一下,請問echarts那邊的程式碼你是怎麼寫的嗎?因為我的資料成功抓取了但要放進圖表的部分都一直失敗...圖表好像沒辦法辨識陣列資料...非常謝謝你><

2
海綿寶寶
iT邦大神 1 級 ‧ 2021-09-16 15:45:25

把以下程式碼貼到練習區試試看
如果是你要的結果
再來看 php 要怎麼寫 / json 要長如何

option = {
    xAxis: {
        data: ['0-20', '21-40', '41-60', '61-80', '81-100']
    },
    yAxis: {},
    dataGroupId: '',
    animationDurationUpdate: 500,
    series: {
        type: 'bar',
        id: 'sales',
        data: [{
            value: 0,
            groupId: '0-20'
        },{
            value: 0,
            groupId: '21-40'
        },{
            value: 1,
            groupId: '41-60'
        },{
            value: 2,
            groupId: '61-80'
        },{
            value: 2,
            groupId: '81-100'
        }],
        universalTransition: {
            enabled: true,
            divideShape: 'clone'
        }
    }
};

var drilldownData = [{
    dataGroupId: '41-60',
    data: [
        ['詹思婷', 45]
    ]
}, {
    dataGroupId: '61-80',
    data: [
        ['陳國容', 72.8],
        ['蔡思潔', 80]
    ]
}, {
    dataGroupId: '81-100',
    data: [
        ['洪白枝', 83.8],
        ['宋怡菁', 80.8],
    ]
}, ];

myChart.on('click', function (event) {
    if (event.data) {
        var subData = drilldownData.find(function (data) {
            return data.dataGroupId === event.data.groupId;
        });
        if (!subData) {
            return;
        }
        myChart.setOption({
            xAxis: {
                data: subData.data.map(function (item) {
                    return item[0];
                })
            },
            series: {
                type: 'bar',
                id: 'sales',
                dataGroupId: subData.dataGroupId,
                data: subData.data.map(function (item) {
                    return item[1];
                }),
                universalTransition: {
                    enabled: true,
                    divideShape: 'clone'
                }
            },
            graphic: [{
                type: 'text',
                left: 50,
                top: 20,
                style: {
                    text: 'Back',
                    fontSize: 18
                },
                onclick: function () {
                    myChart.setOption(option);
                }
            }]
        });
    }
});

另外
這位是你同學
還是你的分身
/images/emoticon/emoticon61.gif

看更多先前的回應...收起先前的回應...
小魚 iT邦大師 1 級 ‧ 2021-09-16 23:07:46 檢舉

原來是學校作業啊

海綿寶寶對!是我想要的圖表沒錯~想請問大神那我的php/json該怎麼樣改才能讓圖表出現><非常感謝你!!!
那位是我同學沒錯~但因為負責不同圖表所以分開問問題~/images/emoticon/emoticon41.gif

其實你已經寫得差不多了
以下程式碼拿去隨意修改使用
看看會不會動

<?php

$arrGroup = array();

class MainGroup {
	public $value=0;
	public $groupId="";
}

$onegroup = new MainGroup();
$onegroup->value = 0; $onegroup->groupId = "0-20"; array_push($arrGroup, $onegroup);

$onegroup = new MainGroup();
$onegroup->value = 0; $onegroup->groupId = "21-40"; array_push($arrGroup, $onegroup);

$onegroup = new MainGroup();
$onegroup->value = 1; $onegroup->groupId = "41-60"; array_push($arrGroup, $onegroup);

$onegroup = new MainGroup();
$onegroup->value = 2; $onegroup->groupId = "61-80"; array_push($arrGroup, $onegroup);

$onegroup = new MainGroup();
$onegroup->value = 2; $onegroup->groupId = "81-100"; array_push($arrGroup, $onegroup);

$maingroup = json_encode($arrGroup);

print_r($arrGroup);
echo $maingroup;

//--------------------------------------

$arrDrilldown = array();

class DrillDown {
	public $dataGroupId = "";
	public $data = array();
}

$onedrilldown = new DrillDown();
$onedrilldown->dataGroupId = "41-60";
$arr = array();array_push($arr, "詹思婷");array_push($arr, 45);array_push($onedrilldown->data, $arr);
array_push($arrDrilldown, $onedrilldown);

$onedrilldown = new DrillDown();
$onedrilldown->dataGroupId = "61-80";
$arr = array();array_push($arr, "陳國容");array_push($arr, 72.8);array_push($onedrilldown->data, $arr);
$arr = array();array_push($arr, "蔡思潔");array_push($arr, 80);array_push($onedrilldown->data, $arr);
array_push($arrDrilldown, $onedrilldown);

$onedrilldown = new DrillDown();
$onedrilldown->dataGroupId = "81-100";
$arr = array();array_push($arr, "洪白枝");array_push($arr, 83.8);array_push($onedrilldown->data, $arr);
$arr = array();array_push($arr, "宋怡菁");array_push($arr, 80.8);array_push($onedrilldown->data, $arr);
array_push($arrDrilldown, $onedrilldown);

$drilldown = json_encode($arrDrilldown);

print_r($arrDrilldown);
echo $drilldown;
?>

海綿寶寶好的~真的非常謝謝你/images/emoticon/emoticon41.gif

海綿寶寶抱歉我想再問您一下~因為我資料的部分是希望php可以自動抓取資料庫資料(目前資料庫只放五筆是因為還在測試~)但我看大神您寫的程式好像是把資料資料直接放入php~想問有可以讓他自動抓取資料的方法嗎~非常謝謝你

完整的流程是「讀資料庫->取得資料->組成 HTML(javascript)」

因為我沒有你的資料庫
所以才把資料直接放入 php 中

你現在要做的是:
1.讀資料庫的資料
2.想辦法「組」出 html(javascript)

就可以了

原來是

echo "var drilldownData = [{";
echo "    dataGroupId: '41-60',";
echo "    data: [";
echo "        ['詹思婷', 45]";
echo "    ]";
echo "}, {";
echo "    dataGroupId: '61-80',";
echo "    data: [";
echo "        ['陳國容', 72.8],";
echo "        ['蔡思潔', 80]";
echo "    ]";
echo "}, {";
echo "    dataGroupId: '81-100',";
echo "    data: [";
echo "        ['洪白枝', 83.8],";
echo "        ['宋怡菁', 80.8],";
echo "    ]";
echo "}, ]";

改成(大概是這樣,細節要調整)

echo "var drilldownData = " . json_encode($userdata);

我要發表回答

立即登入回答