2013-08-29 59 views
0

一些背景。我有兩個來自PubMed XML文件的MySQL表。 pubauth表具有給定參考的所有作者,並且pubmed表具有所有獨特的pubmed信息。每個發佈的記錄有n + 1位作者。我想我需要是這樣的:使用Codeigniter從MySQL查詢創建多維數組

Array(
    [id]=> Array([id]=>1 
     [PMID]=>123456 
     Array(
      [pubauth]=>Array(
       [pubauth_id]=>1 
       [LastName]=>Chen 
      ) 
     ) 
    ) 
) 

我的模式是:

$this->db->select('pubmed.id, PMID, pubauth.id AS pubauth_id, LastName'); 
$this->db->from('pubmed'); 
$this->db->join('pubauth', 'pubmed_id = pubmed.id', 'left outer');   
$this->db->where('idecm',$keyword); 
$query = $this->db->get(); 
$temp_result = array(); 
foreach ($query->result_array() as $row){ 
    $temp_result[] = array(
      'pubmed_id' => $row['id'], 
      'PMID'  => $row['PMID'], 
      'LastName' => $row['LastName'], 
      'pubauth_id'=> $row['pubauth_id'] 
    ); 
} 

這將返回各行作爲$ temp_result陣列。我拍攝的內容類似於這個問題:PHP MYSQL multidimensional array。根據答案替換的foreach在我的模型,我有:

foreach ($query->result_array() as $row) 
{ 
    $r_array[$row["id"]]=array(); 

    $row_st = (string) $row["pubauth_id"]; 
    $r_array[$row["id"]][] = $row_st; 
} 

foreach ($r_array as $id => & $data) { 
// Start with just ID 
$newarray = array(
    "id" => $id 
); 

if (count($data) == TRUE) 
    $newarray["pubauth_id"] = & $data; 

$finalarray[] = & $newarray; 
print_r($finalarray); 
unset($newarray); 
} 

這陣我從這個得到的是

Array ([0] => Array ([id] => 1 [pubauth_id] => Array ([0] => 7))) Array ([0] => Array ([id] => 1 [pubauth_id] => Array ([0] => 7)) [1] => Array ([id] => 2 [pubauth_id] => Array ([0] => 17))) 

數據,只有最後一排和姓氏丟失。對不起漫不經心,但這讓我失望了。我可以使用二維數組,但似乎無法繞過這一個。我在View中拍攝的輸出看起來像PubMed參考文獻; Author1 ... Author_n,標題,數據,日誌,卷,問題,頁面。我現在所能得到的是每個作者的標題,數據,期刊,卷,期,頁面作爲一行。任何幫助將不勝感激。

回答

0

我得到我現在需要的結果。仍然不確定這是最有效的方式,因爲我不能想到只使用一個數據庫查詢的方法。我必須稍微改變我的Smarty模板。

<table class="table table-striped"> 
<tbody> 
     {foreach $data as $apub} 
      <tr> 
       <td > 
        {assign var = "title" value = '. '|cat:$apub['ArticleTitle']|cat:' ('|cat:$apub['PubDate']|cat:') '|cat:$apub['Title']|cat:'. '|cat:$apub['Volume']|cat:'('|cat:$apub['Issue']|cat:')'|cat:$apub['MedlinePgn'] } 

        {foreach $apub['authors'] as $apeople} 
         {assign var = "sauthors" value = ''} 
         {if $apub["id"] == $apeople["pubmed_id"]} 
          {assign var = "authors" value = ' '|cat:$apeople['LastName']|cat:' '|cat:$apeople['Initials'] scope="global"} 
          {$authors} 
         {/if} 
        {/foreach} 
        {$title} 
       </td> 
{/tr} 

這顯示作者1 ... AuthorN標題年雜誌卷第5期的頁面。

0

我已經解決了我的問題。這可能不是最有效的方法,因爲它需要兩個連續的MySQL要求來獲取數據。該解決方案部分來自於這篇文章:Nested foreach()。我的新模式:

//Retrieve pubmed record 
$this->db->select('pubmed.id, PMID); 
$this->db->from('ecmnote'); 
$this->db->join('pubmed', 'pubmed.idecm = ecmnote.idecm', 'left'); 
$this->db->where('ecmnote.idecm',$key); 
$query = $this->db->get(); 

//Retrieve associated authors. 
$this->db->select('pubmed.id AS pubmed_id, LastName); 
$this->db->from('ecmnote'); 
$this->db->join('pubmed', 'pubmed.idecm = ecmnote.idecm', 'left'); 
$this->db->join('pubauth', 'pubmed_id = pubmed.id'); 
$this->db->where('pubmed.idecm',$key); 
$auth_query = $this->db->get(); 

$pub = array(); 
$auth = array(); 

foreach ($auth_query->result_array() as $r){ 
    $auth[] = array (
       'pubmed_id'=> $r['pubmed_id'], 
       'LastName' => $r['LastName'] 
       ); 
} 

foreach ($query->result_array() as $row){ 
     $pub[] = array(
       'PMID' => $row["PMID"], 
       'authors' => $auth 
       ); 
} 
return $pub; 

從控制器我通過這一個Smarty的模板進行查看。我的看法是這樣的:

<table class="table table-striped"> 
<tbody> 
     {foreach $data as $apub} 
      <tr> 
       <td > 
        {assign var = "title" value = '. '|cat:$apub['ArticleTitle']|cat:' ('|cat:$apub['PubDate']|cat:') '|cat:$apub['Title']|cat:'. '|cat:$apub['Volume']|cat:'('|cat:$apub['Issue']|cat:')'|cat:$apub['MedlinePgn'] } 

        {foreach $apub as $svar=>$sval} 
         {if ($svar === "authors")} 
          {foreach $sval as $apeople} 
           {assign var = "sauthors" value = ' '|cat:$apeople['LastName']|cat:' '|cat:$apeople['Initials'] scope="global"} 

           {$sauthors} 

          {/foreach} 
         {/if} 
        {/foreach} 

       {$title} 

       </td> 

有沒有辦法讓這個更高效?當我將MySQL查詢合併爲一個時,我得到一個多維數組,每個作者加上pubmed表作爲自己的數組。我永遠無法讓它正確顯示。

+0

這實際上仍然無法正常工作。作者的{foreach}遍歷每篇PubMed文章的所有作者。 –