2013-08-29 4 views
0

Некоторые фон. У меня есть две таблицы MySQL, полученные из файлов PubMed XML. В таблице pubauth есть все авторы для данной ссылки, а в опубликованной таблице есть вся уникальная информация. Для каждой опубликованной записи есть n + 1 авторов. То, что я думаю, что мне нужно это:Создание многомерного массива из MySQL запросов с использованием Codeigniter

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 ($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, Title, Data, Journal, Volume, Issue, Page. Теперь я могу получить название, данные, журнал, том, выпуск, страницу для каждого автора в виде строки. Любая помощь будет оценена.

ответ

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 ... Автор N Название Год Журнал Объем Страницы выпуска.

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-запрос в один, я получаю многомерный массив, в котором есть каждый автор плюс опубликованная таблица как собственный массив. Я никогда не смогу правильно отобразить это.

+0

Это на самом деле все еще работает неправильно. {Foreach} по авторам просматривает все авторы для каждой статьи PubMed. –

Смежные вопросы