【问题标题】:How to loop through a JSON string inside an array for getting particular column如何遍历数组中的 JSON 字符串以获取特定列
【发布时间】:2018-04-17 12:16:18
【问题描述】:

我正在尝试从 API 获取数据,为此我正在使用 php curl。

我的 API 数据如下所示:

{"COLUMNS":["COCD","CONAME","KINDOFACCOUNT","ACCOUNTCODE","ACCOUNTNAME","TELNO","FAX","ADDR","OPENINGBALANCE","DR_AMT","CR_AMT","VOUCHERDATE","SETTLEMENT_NO","CTRCODE","CTRNAME","TRANS_TYPE","VOUCHERNO","NARRATION","BILLNO","CHQNO","EXPECTED_DATE","TRADING_COCD","PANNO","EMAIL","MANUALVNO","BOOKTYPECODE","BILL_DATE","MKT_TYPE","GROUPCODE","BRSFLAG","SETL_PAYINDATE","LAST2SETL","ACCOUNTCODE1","GATEWAYID","PUNCH_TIME","TRANS_TYPE1"],"DATA":[["MCX","","PARTY","TT3405","ANTHONIRAJ P","","","","0","","","","","","","","","","","","","","","","","3","","","","","","","TT3405","","",""],["MCX","","PARTY","TT3405","ANTHONIRAJ P","","","","0","","","","","","","","","","","","","","","","","3","","","","","","","TT3405","","",""],["NSE_FNO","","PARTY","TT3405","ANTHONIRAJ P","","","","0","","","","","","","","","","","","","","","","","3","","","","","","","TT3405","","",""],["NSE_FNO","","PARTY","TT3405","ANTHONIRAJ P","","","","0","","","","","","","","","","","","","","","","","3","","","","","","","TT3405","","",""],["NSE_FNO","","PARTY","TT3405","ANTHONIRAJ P","","","","0","0.00","500.00","","0","0","","OP","0","OPENING BALANCE","0","0","","NSE_FNO","","","0","3","","","","","","","TT3405","","",""],["MCX","","PARTY","TT3405","ANTHONIRAJ P","","","","0","0.00","1192.77","","0","0","","OP","0","OPENING BALANCE","0","0","","MCX","","","0","3","","","","","","","TT3405","","",""]]}

我能够获取数组,即所有 COLUMNS 名称,但是当我尝试仅获取 COCD 列时,它说:注意:尝试获取非对象的属性

我的代码如下:

<?php
  $url = 'http://myapi.cfm';
  $curl = curl_init();

  curl_setopt_array($curl, array(
      CURLOPT_URL => $url,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => "",
      CURLOPT_HTTPHEADER => array(
        "accept: application/json",
        "cache-control: no-cache",
        "content-type: application/json"
       ),));

  $response = curl_exec($curl);
  $err = curl_error($curl);
  curl_close($curl);

  if ($err) {
      echo "cURL Error #:" . $err;
  } else {
      $characters = json_decode($response, true);
      print_r ($characters['COLUMNS']);

      foreach ($characters as $character) {
         print_r ($character->CONAME . '<br>');
          }
       }
?>

请帮忙,我正在寻找答案很长时间。

【问题讨论】:

  • 看起来你把它弄反了,你的容器是一个对象,所以$characters-&gt;COLUMNS又是一个数组......所以循环中的$characters-&gt;COLUMNS[1]$character[1]是@987654326 @.
  • 你明确告诉json_decode() 给你一个关联数组,所以你不会有任何对象,只有嵌套数组。而CONAME 只是您的一个元素中的值,而不是键。
  • @CD001 当我使用 $characters->COLUMNS['CONAME'] 时出现同样的错误,注意:未定义索引:当我在循环中使用 $character['CONAME'] 时出现 CONAME
  • 你应该漂亮地打印/var_dump()解码后的数组,你会清楚地看到问题所在。
  • 请使用 print_r ($character->CONAME . '
    ');到“回声$字符[0];”在 foreach 循环中。请这个鳕鱼使用:- foreach ($characters as $character) { //echo '
    '; print_r($字符);回声$字符[0]; //回显$字符[0]; }

标签: php arrays json api curl


【解决方案1】:

这是翻译此数据的一种方法...

// Standard JSON decode, no `true` second parameter
$source = json_decode('{"COLUMNS":["COCD","CONAME","KINDOFACCOUNT","ACCOUNTCODE","ACCOUNTNAME","TELNO","FAX","ADDR","OPENINGBALANCE","DR_AMT","CR_AMT","VOUCHERDATE","SETTLEMENT_NO","CTRCODE","CTRNAME","TRANS_TYPE","VOUCHERNO","NARRATION","BILLNO","CHQNO","EXPECTED_DATE","TRADING_COCD","PANNO","EMAIL","MANUALVNO","BOOKTYPECODE","BILL_DATE","MKT_TYPE","GROUPCODE","BRSFLAG","SETL_PAYINDATE","LAST2SETL","ACCOUNTCODE1","GATEWAYID","PUNCH_TIME","TRANS_TYPE1"],"DATA":[["MCX","","PARTY","TT3405","ANTHONIRAJ P","","","","0","","","","","","","","","","","","","","","","","3","","","","","","","TT3405","","",""],["MCX","","PARTY","TT3405","ANTHONIRAJ P","","","","0","","","","","","","","","","","","","","","","","3","","","","","","","TT3405","","",""],["NSE_FNO","","PARTY","TT3405","ANTHONIRAJ P","","","","0","","","","","","","","","","","","","","","","","3","","","","","","","TT3405","","",""],["NSE_FNO","","PARTY","TT3405","ANTHONIRAJ P","","","","0","","","","","","","","","","","","","","","","","3","","","","","","","TT3405","","",""],["NSE_FNO","","PARTY","TT3405","ANTHONIRAJ P","","","","0","0.00","500.00","","0","0","","OP","0","OPENING BALANCE","0","0","","NSE_FNO","","","0","3","","","","","","","TT3405","","",""],["MCX","","PARTY","TT3405","ANTHONIRAJ P","","","","0","0.00","1192.77","","0","0","","OP","0","OPENING BALANCE","0","0","","MCX","","","0","3","","","","","","","TT3405","","",""]]}');

// Loop over each row and turn it into assoc array
foreach( $source->DATA as &$data )
{
  $data = array_combine( $source->COLUMNS, $data );
}

// Get just the COCD column
print_R( array_column( $source->DATA, 'COCD' ) );

//  Array
//  (
//    [0] => MCX
//    [1] => MCX
//    [2] => NSE_FNO
//    [3] => NSE_FNO
//    [4] => NSE_FNO
//    [5] => MCX
//  )

【讨论】:

  • 非常感谢.. 回复是这样的:Array ( [0] => MCX [1] => MCX [2] => NSE_FNO [3] => NSE_FNO [4] => NSE_FNO [5] => MCX ) .. 怎么做才能在前面隐藏单词数组和索引,我会接受这个答案
  • 您可以只使用$COCD = array_column( $source-&gt;DATA, 'COCD' );,然后根据需要使用$COCDprint_r 仅用于调试/演示。
  • 所以我做了:$source = json_decode($response); // 循环遍历每一行并将其转换为 assoc 数组 foreach( $source->DATA as &$data ) { $data = array_combine( $source->COLUMNS, $data ); } // 只获取 COCD 列 $COCD = array_column( $source->DATA, 'COCD' );回声$COCD;但是报错:注意:数组到字符串的转换
  • 您不能只使用echo $COCD;,因为它是一个数组,您想如何使用该数据? echo implode(',',$COCD); 会起作用,因为它是一个字符串...
  • 再次感谢您的帮助,我已经接受了您的回答。最后一个问题,如果我只想在该列中显示最后一个可用数据,例如此处的 CR_AMT 是 1192.77
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 2015-10-10
  • 2018-05-06
  • 2020-09-04
相关资源
最近更新 更多