在result_array()中解码数据库结果中存储的JSON值

时间:2019-08-09 12:59:06

标签: php codeigniter

我想从存储在db中的json中提取值,但是我无法弄清楚。 这是我的数据库,就像:

+-------------------+-------------------------------------------------+---------------------+---------------------+
| refid             |                      kepribadian                | jam_mulai           | jam_selesai         |
+-------------------+-------------------------------------------------+---------------------+---------------------+
| GAD25D335B0F1DE3B | {"Introversion":"53.3%","Extroversion":"46.7%"} | 2019-08-09 01:16:00 | 2019-08-09 01:19:46 |
| GAD25D32DAE90578A | {"Introversion":"63.3%","Extroversion":"34.7%"} | 2019-08-09 08:55:47 | 2019-08-09 08:56:48 |
+-------------------+-------------------------------------------------+---------------------+---------------------+

这是我的模特:

public function filter_hasil_mbti($search, $limit, $start, $order_field, $order_ascdesc)
{

    $sql =  $this->db->select('a.id AS id, a.refid AS refid, CONCAT(b.firstname," ",b.lastname) AS fullname, a.kepribadian AS kepribadian, a.jam_mulai AS jam_mulai, a.jam_selesai AS jam_selesai, a.percentage AS percentage')
            ->from('jawaban_mbti as a')
            ->join('registrasi_baru as b', 'a.refid=b.refid', 'left')
            ->like('a.refid', $search)
            ->or_like('b.firstname', $search)
            ->or_like('b.lastname', $search)
            ->or_like('a.kepribadian', $search)
            ->or_like('a.jam_mulai', $search)
            ->or_like('a.jam_selesai', $search)
            ->order_by($order_field, $order_ascdesc)
            ->limit($limit, $start)
            ->get()->result_array();

    return $sql;
}

因此,我可以将列kepribadian json作为键访问并将其全部存储在result_array()中 我该怎么办?

谢谢。

更新

这是我的控制器:

public function ajax_jawaban_mbti()
{
    $search         = $_POST['search']['value'];
    $limit          = $_POST['length'];
    $start          = $_POST['start'];
    $order_index    = $_POST['order'][0]['column'];
    $order_field    = $_POST['columns'][$order_index]['data'];
    $order_ascdesc  = $_POST['order'][0]['dir'];

    $sql_total      = $this->mhasil->count_all_Soal('jawaban_mbti');
    $sql_data       = $this->mhasil->filter_hasil_mbti($search, $limit, $start, $order_field, $order_ascdesc);
    $sql_filter     = $this->mhasil->count_filter_hasil_mbti($search);

    //print_r($sql_data);die;

    $callback       = array(
        'draw'              => $_POST['draw'],
        'recordsTotal'      => $sql_total,
        'recordsFiltered'   => $sql_filter,
        'data'              => $sql_data,
    );

    //header('Content-Type: application/json');
    echo json_encode($callback);
}

3 个答案:

答案 0 :(得分:1)

您可以使用json_decode将其转换为波纹管这样的数组:

示例:

import socket
from multiprocessing import Pool
from struct import pack

# Start and connect a socket
s = socket.socket()
s.connect((ip, port))

# Data to be packed and sent in this order
data1 = 1, 2, 3, 4
data2 = 5, 6, 7, 8
data3 = 9, 10, 11, 12

# Top level column packer/sender for mp.pool
def send_column(column):
    return s.send(pack(f'{len(column)}i', *column))


pool = Pool()

# Will this necessarily send the data in order?
pool.map(send_column, (data1, data2, data3))

我建议将变量名从$ sql更改为$ results,因为您返回的是数组而不是sql

更新1:

 $json = '{"Introversion":"53.3%","Extroversion":"46.7%"}';
 $array = json_decode($json)
 var_dump($array);

结果将是这样的:

foreach ($sql as $key => $val) {
// you can add in the second argument of json_decode 1 to have a array instead of a object.
if(isset($val['kepribadian']))
    $sql[$key]['kepribadian'] = json_decode($val['kepribadian']);
}

答案 1 :(得分:0)

我想您将从select语句中获取数据数组,其中“ kepribadian”列是值之一。因此,您要做的就是将此列从JSON解码为PHP数组。

原则上是这样,(未经测试)

...
$sqlrec = filter_hasil_mbti(...  ...);
$phpArr = json_decode($sqlrec['kepribadian']);
...

答案 2 :(得分:0)

您可以尝试

<?php
    $json_decoded = json_decode(array_column($rsult, "kepribadian"), true);
 ?>
  

如果在true中添加json_decode()参数,则结果将作为PHP数组给出。

玩得开心:)