处理来自fatfree DB SQL Mapper的json编码结果

处理来自fatfree DB SQL Mapper的json编码结果,json,fat-free-framework,Json,Fat Free Framework,我无法将DB SQL映射器返回的结果处理到可识别的json编码数组中 function apiCheckSupplyId() { /*refer to the model Xrefs*/ $supply_id = $this->f3->get('GET.supply_id'); $xref = new Xrefs($this->tongpodb); $supply = $xref->getBySupplyId( $supply_id ); if ( c

我无法将DB SQL映射器返回的结果处理到可识别的json编码数组中

function apiCheckSupplyId() {
  /*refer to the model Xrefs*/
  $supply_id = $this->f3->get('GET.supply_id');
  $xref = new Xrefs($this->tongpodb);
  $supply = $xref->getBySupplyId( $supply_id );
  if ( count( $supply ) == 0 ) {
    $this->logger->write('no xref found for supply_id=' .$supply_id);
    $supply = array( array('id'=>0) );

    echo json_encode( $supply );
  } else {
    $json = array();
    foreach ($supply as $row){
      $item = array();
      foreach($row as $key => $value){
        $item[$key] = $value;
      }
      array_push($json, $item);
    }


    $this->logger->write('xref found for supply_id=' .$supply_id.json_encode( $json )  );
    echo json_encode( $json );
  }
}

这是我正在使用的方法,但对我来说似乎很笨拙。有更好的方法吗?

假设
getBySupplyId
返回一个
Xref
映射器数组,您可以简化整个过程,如下所示:

function apiCheckSupplyId() {
  $supply_id = $this->f3->get('GET.supply_id');
  $xref = new Xrefs($this->tongpodb);
  $xrefs = $xref->getBySupplyId($supply_id);
  echo json_encode(array_map([$xref,'cast'],$xrefs));
  $this->logger->write(sprintf('%d xrefs found for supply_id=%d',count($xrefs),$supply_id));
}
说明:

$xrefs
变量包含映射器数组。每个映射器都是一个对象,在将其编码为JSON之前,必须将其映射到一个数组中。通过将
$xref->cast()
方法映射到每个记录,
数组映射([$xref,'cast'],$xrefs)
,这可以在一行中完成

如果您对该语法没有信心,可以循环遍历每条记录并强制转换它:

$cast=[];
foreach ($xrefs as $x)
  $cast[]=$x->cast();
echo json_encode($cast);
结果是一样的


使用
cast()
other只需读取每个值(就像您在原始脚本中所做的那样)的优点是,它还包括外部参照。

您希望每个供应有多少外部参照?1.或者更多?一个是理想的,但在这个古怪的世界里不能保证