Php 使用Codeigniter从MySQL查询创建多维数组
一些背景。我有两个从PubMedXML文件派生的MySQL表。pubauth表具有给定引用的所有作者,pubmed表具有所有唯一的pubmed信息。每个pubmed记录有n+1个作者。我想我需要的是:Php 使用Codeigniter从MySQL查询创建多维数组,php,mysql,codeigniter,multidimensional-array,Php,Mysql,Codeigniter,Multidimensional Array,一些背景。我有两个从PubMedXML文件派生的MySQL表。pubauth表具有给定引用的所有作者,pubmed表具有所有唯一的pubmed信息。每个pubmed记录有n+1个作者。我想我需要的是: Array( [id]=> Array([id]=>1 [PMID]=>123456 Array( [pubauth]=>Array( [pubauth_id]=>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中的数组返回。我射击的目的类似于这个问题:。根据答案,在我的模型中替换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引用;作者1…作者、标题、数据、期刊、卷、期、页。我现在能得到的只是每一位作者作为一行的标题、数据、期刊、卷、期、页。任何帮助都将不胜感激。我已经解决了我的问题。这可能不是最有效的方法,因为它需要两个连续的MySQL请求来获取数据。解决方案部分来自此帖子:。我的新型号:
//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>
{foreach$data as$apub}
{assign var=“title”value='。| cat:$apub['articletTitle']| cat:'('cat:$apub['PubDate']]| cat:')。| cat:$apub['title']| cat:'('cat:$apub['Issue']| cat:')'| cat:$apub['MedlinePgn']
{foreach$apub as$svar=>$sval}
{if($svar==“authors”)}
{foreach$sval作为$apeople}
{assign var=“sauthors”value=''| cat:$apeople['LastName']| cat:''| cat:$apeople['Initials']scope=“global”}
{$sauthors}
{/foreach}
{/if}
{/foreach}
{$title}
有没有办法让这更有效?当我将MySQL查询合并为一个查询时,我得到一个多维数组,其中每个作者加上pubmed表作为自己的数组。我永远无法正确显示它。我现在得到了需要的结果。仍然不确定这是最有效的方法,因为我想不出一种方法只使用一个DB查询。我不得不稍微改变一下我的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}
{foreach$data as$apub}
{assign var=“title”value='。| cat:$apub['articletTitle']| cat:'('cat:$apub['PubDate']]| cat:')。| cat:$apub['title']| cat:'('cat:$apub['Issue']| cat:')'| cat:$apub['MedlinePgn']
{foreach$apub['authors']作为$apeople}
{assign var=“sauthors”值=''''}
{如果$apub[“id”]==$apeople[“pubmed_id”]}
{assign var=“authors”value=''| cat:$apeople['LastName']| cat:''| cat:$apeople['Initials']scope=“global”}
{$authors}
{/if}
{/foreach}
{$title}
{/tr}
这将显示Author1。。。编写标题年期刊卷发行页。这实际上仍然无法正常工作。authors上的{foreach}循环遍历每个PubMed文章的所有作者。