2017-06-29 65 views
-1

我在將返回的結果從數據庫SQL映射器處理成可識別的json編碼數組時遇到問題。來自fatfree DB SQL Mapper的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); 
    } 
} 

這是我使用的方法,但對我來說似乎很笨重。有沒有更好的辦法?

+0

您希望每個供應有多少外部輪廓? 1?或者更多? – xfra35

+0

其中一個將是理想的,但在這個古怪的世界中無法保證 –

回答

1

假設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之前,您必須將其cast映射到一個數組。通過將$xref->cast()方法映射到每個記錄,可以在一行中完成此操作:array_map([$xref,'cast'],$xrefs)

如果你不自信與語法,可以通過每個記錄循環,並投它:

$cast=[]; 
foreach ($xrefs as $x) 
    $cast[]=$x->cast(); 
echo json_encode($cast); 

的結果是一樣的。

使用cast()其他僅僅讀取每個值(如您在原始腳本中執行的操作)的優點是它也包含virtual fields