Эхо-массив на основе отдельного ключа

Я «заказал» базу данных в порядке возрастания по стране, а затем по убыванию. Каждая запись базы данных содержит: название страны, год, детали. Есть много стран-дубликатов, но годы разные. Например:

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

Не могу понять, как отобразить массив, чтобы получить результаты, подобные следующим, где страна находится на одной строке и годах & подробности приведены ниже без дублирования названия страны:

Albania
2000,  details
1965,  details

Croatia
2014,  details
2003,  details

Кажется, мне нужна каждая страна, год и детали?

Вот мой 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 /> ";
}

Буду признателен за любую помощь, я в тупике!

1

Решение

Попробуйте добавить проверку страны:

$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 /> ";
}

Это должно работать, потому что вы заказали свой запрос по стране. Это очень важно, в противном случае вы должны абсолютно добавить GROUP BY пункт к вашему SQL.

РЕДАКТИРОВАТЬ: добавить <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, так что вы можете использовать это с toggle в вашем JQuery.

2

Другие решения

Вы можете использовать вложенные циклы while. Вы также можете использовать PDO / mysqli_ functions / подготовленные операторы вместо 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'];
}
}
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);
}
0
По вопросам рекламы [email protected]