Распечатать каскадный стол
-
05-07-2019 - |
Вопрос
Я пытаюсь загрузить данные из базы данных и отобразить их в таблице, как здесь:
http://img196.imageshack.us/img196/1857/cijene.jpg р>
В базе данных у меня есть две таблицы:
cities (id, name)
prices (id, city1_id, city2_id, price)
Например, напечатанная таблица для 4 городов будет выглядеть следующим образом:
<table>
<tr>
<td>city1</td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> price_city1-city2</td>
<td>city2</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> price_city1-city3</td>
<td> price_city2-city3</td>
<td>city3</td>
<td> </td>
</tr>
<tr>
<td> price_city1-city4</td>
<td> price_city2-city4</td>
<td> price_city3-city4</td>
<td>city4</td>
</tr>
</table>
Кто-нибудь знает, что такое PHP-оператор для отображения таких таблиц?
Решение
// This single query gets all required data
// NOTE: this query assumes that your price data is entered
// such that from_city always alphabetically precedes to_city!
$sql =
"SELECT a.name AS from_city, b.name AS to_city, price ".
"FROM prices ".
"INNER JOIN cities AS a ON a.id=prices.city1_id ".
"INNER JOIN cities AS b ON b.id=prices.city2_id";
// connect and do query
$conn = mysql_connect($host, $user, $pass);
mysql_select_db($db, $conn);
$q = mysql_query($sql, $conn);
// Stuff all data into an array for manipulation;
// keep list of all cities mentioned
$price = array();
$cities = array();
while (($res = mysql_fetch_assoc($q)) !== false) {
$from = $res['from_city'];
$cities[ $from ] = true;
$to = $res['to_city'];
$cities[ $to ] = true;
$price[$to][$from] = $res['price'];
}
// Invert to get alphabetical list of cities
$cities = array_keys($cities);
sort($cities);
$num = count($cities);
// some utility functions
function table($rows) {
return '<table>'.join($rows).'</table>';
}
function row($cells) {
return '<tr>'.join($cells).'</tr>';
}
function cell($text) {
$text = (string) $text;
if (strlen($text)==0)
$text = ' ';
return '<td>'.$text.'</td>';
}
// The data is now in the desired order;
// produce output as HTML table
$rows = array();
for ($to = 0; $to < $num; ++$to) {
$t = $cities[$to];
$cells = array();
for ($from = 0; $from < $to; ++$from) {
$f = $cities[$from];
if isset($price[$t]) && isset($price[$t][$f])
$text = $price[$t][$f];
else
$text = '';
$cells[]= cell($text);
}
$cells[]= cell($t); // add destination-label
for ($from = $to+1; $from < $num; ++$from) // pad to proper number of cells
$cells[]= cell('');
$rows[]= row($cells);
}
$html = table($rows);
// show results!
echo $html;
Другие советы
Я использовал очень простой подход к преобразованию результатов запроса в таблицу HTML. Я проверяю, что $ query_result равен true, и извлекаю результаты в виде ассоциативного массива ...
$query_result = mysqli_query($db, $query);
if ($query_result) {
while ($columns = mysqli_fetch_assoc($query_result)) {
echo "<tr>\n";
foreach ($columns as $name => $column) {
echo "<td>";
printf("%s",$columns[$name]);
echo "</td>\n";
}
echo "</tr>\n";
}
}
РЕДАКТИРОВАТЬ: Теперь я смог посмотреть на ваш стол, я вижу, что я действительно не ответил на ваш вопрос. Запрос, очевидно, очень важен. Возникает ли вопрос: «Как создать запрос, который возвращает результаты, которые могут быть превращены в таблицу с помощью моего простого подхода?»
Я надеюсь, что у кого-то еще есть несколько идей.
Это немного на грани практичности, но я подхожу к этой проблеме больше как упражнение в & "сделай это правильно. "
Я бы сделал простой выбор каждой таблицы и вставил в массив:
$query1 = "SELECT * FROM cities"; $query2 = "SELECT * FROM prices"; $results1 = mysql_query( $query1 ); $results2 = mysql_query( $query2 ); while( $rows = mysql_fetch_array( $results1 ) ) $cities[] = $row['name']; while( $rows = mysql_fetch_array( $results2 ) ) $prices[] = array( $row['city1_id'], $row['city2_id'], $row['name'] );
Затем я бы использовал это для динамического создания двух списков JavaScript:
$java_array1 = "var Cities = new Array;\n"; foreach( $cities as $key=>$city ) $java_array1 .= "Cities[$key] = \"$city\";\n"; $java_array2 = "var Prices = new Array;\n"; foreach( $cities as $key=>$price ) $java_array2 .= "Prices[$key] = new Array( \"{$price[0]}\", \"{$price[1]}\", \"{$price[2]}\", );\n";
Затем я выведу таблицу с тщательно созданными идентификаторами для каждой ячейки. Я бы использовал код, очень похожий на тот, что был в первом ответе, но я бы дал каждой ячейке уникальный идентификатор "cell-<row>-<col>"
.
Последнее, что я хотел бы сделать, это набросать некоторый onload
javascript, который будет заполнять таблицу, используя соответствующие пары. Мой javascript довольно ржавый, но он будет выглядеть примерно так (ПРИМЕЧАНИЕ: псевдокод следует):
n = 1; for( var i in cities ) { // set city names on the diagonal document.getElementById( 'cell-'&i&'-'&i ).innerHTML = names[i]; n = n + 1; } for( var j in prices ) { // use the city IDs in the prices array (see earlier code initializing // prices array) to place the prices document.getElementById( 'cell-'&prices[1]&'-'&prices[2] ).innerHTML = prices[0]; }
Я почти наверняка испортил часть этого javascript; используйте на свой страх и риск.
Это намного сложнее, чем простой ответ, приведенный выше, но я думаю, что это единственный способ сделать это так, чтобы это имело " смысл. " По сути, с помощью этого метода вы размещаете все там, где должен быть , и вам не нужно беспокоиться о нечетных таблицах и странных выборках.