基于不同键的回声数组

时间:2015-02-11 21:50:40

标签: php mysql arrays database key-value

我已经“按顺序”将数据库按照递增的国家/地区顺序排列,然后是下降年份。每个数据库记录包含:countryname,year,details。有许多重复的国家,但年份不同。例如:

Albania,  2000, details  
Albania,  1965, details  
Croatia, 2014, details  
Croatia, 2003, details

无法弄清楚如何回应数组以获得如下所示的结果,其中国家/地区位于一行,而且年份和数量相同。下面列出了详细信息,但没有重复国家名称:

Albania  
    2000,  details  
    1965,  details  

Croatia  
    2014,  details  
    2003,  details  

好像我需要foreach独特的国家,回声年份和细节?

到目前为止,这是我的php:

$result = mysql_query("SELECT country, year, details FROM studies ORDER BY country, year DESC ");  
    //output data from each row in db  
    while($row = mysql_fetch_array($result))  {  
echo "   Country:  " .$row['country']. "<br />      Year:  " .$row['year'].  "    Details:  ".$row['details']. "<br /><br /> ";  
}  

感谢任何帮助,我很难过!

3 个答案:

答案 0 :(得分:2)

尝试添加国家/地区支票:

$newcountry = '';
 while($row = mysql_fetch_array($result))  {
   if ($newcountry != $row['country']) {
     echo "Country:". $row['country']."<br />";
     $newcountry = $row['country'];
   }
  echo " Year:  " .$row['year'].  "    Details:  ".$row['details']. "<br /><br /> ";
}

这应该有效,因为您已按国家/地区订购了查询。这很关键,否则你绝对应该在SQL中添加GROUP BY子句。

编辑:要在群组周围添加<div>,您只需更改回显序列,先检查该国家是否已设置一次。它看起来像是:

 $newcountry = 'undefined';
     while($row = mysql_fetch_array($result))  {
       if ($newcountry !='undefined' && $newcountry != $row['country']){
         echo '</div>'; // only add a closing div if a new country (and not 1st)
       }
       if ($newcountry != $row['country']) {
         echo "Country:". $row['country']."<br /><div class='countryDetail'>";
         $newcountry = $row['country'];
       }// added the start of the <div>
      echo " Year:  " .$row['year'].  "    Details:  ".$row['details']. "<br /><br /> ";
    }
    if ($newcountry != 'undefined') { //make sure at least one <div> is set
      echo "</div>"; // close the last <div>
    }

我将类countryDetail添加到div中,因此您可以在jQuery中将其与toggle一起使用。

答案 1 :(得分:0)

您可以使用嵌套的while循环。您可能还想使用PDO / mysqli函数/预处理语句代替mysql_函数:

// get unique country list first
$sql1 = "SELECT DISTINCT(country) FROM studies ORDER BY country";
$result1 = mysql_query($sql1);

// iterate through result set of sql1
while($row1 = mysql_fetch_array($result1))   
{
     $country = $row1['country'];
     echo "<br>";      // new line
     echo $country;      

     // get year, details for each country
     $sql2 = "SELECT year, details FROM studies WHERE country = '$country' ORDER BY year DESC";
     $result2 = mysql_query($sql2);
     // iterate through result set of $sql2 
     while ($row2 = mysql_fetch_array($result2))
     {
          echo "<br>";      // new line
          echo $row2['year']. ", " . $row2['details']; 
     }
}

答案 2 :(得分:0)

循环派对!

$rows = [];
while($row = mysql_fetch_array($result))  {
    $rows[ $row['country'] ] = [ $row['year'], $row['details'] ];
}

foreach($rows as $country => $row) {
  $details = array_map(function($items) { return sprintf("\t - %s: %s\n", $items[0], $items[1]) }, $row);
  echo sprintf("\n%s:\n %s", $country, $details);
}