0

一些背景。我有两个从 PubMed XML 文件派生的 MySQL 表。pubauth 表包含给定参考的所有作者,而 pubmed 表包含所有唯一的 pubmed 信息。每条 pubmed 记录有 n+1 个作者。我认为我需要的是:

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 ) ) )

数据它只是最后一行,缺少 LastName。很抱歉漫无边际,但这让我很困惑。我可以使用 2D 数组,但似乎无法完全理解这个数组。我在视图中拍摄的输出看起来像 PubMed 参考;Author1...Author_n、标题、数据、期刊、卷、期、页。我现在只能得到每个作者的标题、数据、期刊、卷、期、页。任何帮助将不胜感激。

4

2 回答 2

0

我已经解决了我的问题。这可能不是最有效的方法,因为它需要两个顺序的 MySQL 查询来获取数据。解决方案部分来自这篇文章:嵌套 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 表作为它自己的数组。我永远无法正确显示它。

于 2013-09-05T15:41:15.867 回答
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}

这将显示 Author1 ... AuthorN Title Year Journal Volume Issue Pages。

于 2013-09-11T14:43:48.093 回答