PHP条件从JSON数据过滤结果

时间:2019-06-03 08:28:46

标签: php mysql json codeigniter

我正在尝试从付款状态=已付款的数据库中获取grand_total结果,请查看我的数据库结构,并编写代码,使其不返回已付款状态的付款结果并返回所有结果

这是数据库结构和数据

error 401

到目前为止,这是我的职责

   ref_id |            payment_status          |    grand_total 
     19   |     [{"admin":"","status":"due"}]  |        100
     19   |     [{"admin":"","status":"paid"}] |        50
     19   |     [{"admin":"","status":"paid"}] |        500

我得到的结果= 0

预期结果= 550

编辑:

function total_referral_purchase($referral_id)
{
    $return = 0;
    $sales  = $this->db->get('sale')->result_array();
    foreach ($sales as $row) {
         $payment_status = json_decode($row['payment_status'],true);
         $status = $payment_status['status'];

        if ($row['ref_id'] == $referral_id && $status == 'paid' ) {
            $return += $row['grand_total'];
        }
    }
    return $this->cart->format_number($return);
}

2 个答案:

答案 0 :(得分:3)

json_decode函数根据您的json格式返回一个数组。 因此,您当前代码的结果

json_decode($row['payment_status'],true);

以这种格式返回数组

array(1) {
[0]=>
  array(2) {
    ["admin"]=>
    string(0) ""
    ["status"]=>
    string(4) "paid"
  }
}

因为json周围有'[]',这意味着它将具有多个记录并将其解析为数组。 因此$status始终为null,应替换为

$status = $payment_status[0]['status'];

或从'{"admin":"","status":"paid"}'之类的数据库中更改格式,以当前方式使用。

答案 1 :(得分:2)

您使用的JSON是一个数组,如方括号所示。

有两种方法可以解决此问题:

  1. 您将数据库中的JSON从[{"admin":"","status":"due"}]更改为{"admin":"","status":"due"}。这使它成为单个JSON对象而不是数组。
  2. 使用$status = $payment_status['status'];代替$status = $payment_status[0]['status'];,它从数组的第一个对象中选择“状态”的值。