Applying different CSS to top 10 results of a query - php

The table below prints of the results of a query called $sqlStr3. It works fine. The query is set to return the top 25 results.
I would like to apply a unique CSS class (called "class1" for purposes of this question) to the top ten results in the query. How can I do this?
Thanks in advance,
John
$result = mysql_query($sqlStr3);
$count = 1;
$arr = array();
echo "<table class=\"samplesrec1edit\">";
while ($row = mysql_fetch_array($result)) {
echo '<tr>';
echo '<td class="sitename1edit2a">'.$count++.'.</td>';
echo '<td class="sitename1edit1">'.stripslashes($row["username"]).'</td>';
echo '<td class="sitename1edit2">'.number_format(($row["totalScore2"])).'</td>';
echo '</tr>';
}
echo "</table>";

use this:
$result = mysql_query($sqlStr3);
$count = 1;
$arr = array();
echo "<table class=\"samplesrec1edit\">";
while ($row = mysql_fetch_array($result)) {
if($count < 11){
echo '<tr class="top-10">';
}else{
echo '<tr class="non-top-10">';
}
echo '<td class="sitename1edit2a">'.$count++.'.</td>';
echo '<td class="sitename1edit1">'.stripslashes($row["username"]).'</td>';
echo '<td class="sitename1edit2">'.number_format(($row["totalScore2"])).'</td>';
echo '</tr>';
}
echo "</table>";
access the td of top10 using this css
.top-10 td{
//definitions
}
and access the td of non top10 lines with
.non-top-10 td{
//definitions
}

... class="...<?php if ($count <= 10) { ?> class1<?php } ?>" ...
And move the increment to the end of the loop.

you can do it in the server side via php like:
echo '<tr '.($count <=10 ? 'myclass' : '').' > ;
or in jquery in front side like:
$("someTableSelector").find("tr:lt(10)").addClass('myclass')

How about assigning each result from TOP10 a unique class called top_result_[n]?
while ($row = mysql_fetch_array($result)) {
echo '<tr'.($count++ <=10 ? ' class="top_result_'.$count.'"' : '').'>';
echo '<td class="sitename1edit2a">'.$count.'.</td>';
echo '<td class="sitename1edit1">'.stripslashes($row["username"]).'</td>';
echo '<td class="sitename1edit2">'.number_format(($row["totalScore2"])).'</td>';
echo '</tr>';
}
echo "</table>";
I'm not sure wether you want to apply ONE class for all 10 results or UNIQUE class for each from 10 results, as for the first case, the code would be:
while ($row = mysql_fetch_array($result)) {
echo '<tr'.($count++ <=10 ? ' class="top_result"' : '').'>';
echo '<td class="sitename1edit2a">'.$count.'.</td>';
echo '<td class="sitename1edit1">'.stripslashes($row["username"]).'</td>';
echo '<td class="sitename1edit2">'.number_format(($row["totalScore2"])).'</td>';
echo '</tr>';
}
echo "</table>";

Use CSS:
.samplesrec1edit tr:nth-child(-n+10) {
cssrule:value;
}
This technique only works in newer browsers however. The following link has compatibility charts.
http://reference.sitepoint.com/css/pseudoclass-nthchild

Related

how to correctly accommodate the values?

I would like how to put the second result of the second query. the value is shows under row and I want that value is in front of the first result query.
The result should be shown where it is marked in red
$resultados=$reporte->facturaCompleto();
while($fila = mysqli_fetch_array($resultados))
{
$bandera=0;
echo "<tr style=''>";
echo '<td>'.utf8_encode($fila["factura"]).'</td>';
echo '<td>'.utf8_encode($fila["rfc_emisor"]).'</td>';
echo '<td></td>';
echo '<td></td>';
echo '</tr>';
//
$id_documento=$fila["id_documento"];
$reporte->set('id_documento',$id_documento);
$reporte->contador();
$contador=$reporte->get('contador');
$id_documento=$fila["id_documento"];
$reporte2->set('id_documento',$id_documento);
$resultadosmov = $reporte2->movimientos();
while($fila2 = mysqli_fetch_array($resultadosmov))
{
echo'<tr>';
echo '<td></td>';
echo '<td></td>';
echo '<td>'.utf8_encode($fila2["no_parcialidad"]).'</td>';
echo '<td>'.utf8_encode($fila2["importe_total"]).'</td>';
echo '</tr>';
}
}
echo '</table>';
echo "</td></tr></table>";
Echo all the columns when processing the second query.
$resultados=$reporte->facturaCompleto();
while($fila = mysqli_fetch_array($resultados))
{
$bandera=0;
//
$id_documento=$fila["id_documento"];
$reporte->set('id_documento',$id_documento);
$reporte->contador();
$contador=$reporte->get('contador');
$id_documento=$fila["id_documento"];
$reporte2->set('id_documento',$id_documento);
$resultadosmov = $reporte2->movimientos();
if ($resultadosmov->num_rows > 0) {
while($fila2 = mysqli_fetch_array($resultadosmov))
{
echo "<tr>";
echo '<td>'.utf8_encode($fila["factura"]).'</td>';
echo '<td>'.utf8_encode($fila["rfc_emisor"]).'</td>';
echo '<td>'.utf8_encode($fila2["no_parcialidad"]).'</td>';
echo '<td>'.utf8_encode($fila2["importe_total"]).'</td>';
echo '</tr>';
// Make 1st two columns blank in additional rows
$fila["factura"] = "";
$file["rfc_emisor"] = "";
}
} else {
echo "<tr style=''>";
echo '<td>'.utf8_encode($fila["factura"]).'</td>';
echo '<td>'.utf8_encode($fila["rfc_emisor"]).'</td>';
echo '<td></td>';
echo '<td></td>';
echo '</tr>';
}
}
BTW, what is the $bandera variable for? It's set but never used.
It would probably be even better if you could join the two queries, instead of doing queries in a loop.

Generate a table with PHP

I'm trying to generate a table in PHP.
I need this table has 365 cells.
Each row need to contains 30 cells.
How is it possible please?
Actually, I have:
echo '
<table class="table">
';
$dates = getDatesFromRange('2017-01-01', '2018-01-01');
$i=1;
$limit=30;
// $dates contains an array of 365 dates
foreach($dates as $date){
if($i <= $limit) {
echo '<td width="20">'.-.'</td>';
$i++;
}
else {
echo '<tr><td width="20">'.-.'</td></tr>';
$i=1;
}
}
echo '
</table>
';
Use nested loops for this:
$cells_per_row = 30;
$rows = ceil(count($dates)/$cells_per_row);
echo '<table class="table">';
for($i=0;$i<$rows;$i++){
echo '<tr>';
for($u=0;$u<$cells_per_row;$u++){
if(!isset($dates[$i*$cells_per_row+$u])) // stop if end of array is reached
break;
echo '<td width="20">'.$dates[$i*$cells_per_row+$u].'</td>';
}
echo '</tr>';
}
echo '</table>';

Print Function values inside a table?

How do I print the value of a function inside a table? I'm having a hard time trying to figure this out, looked it up in Google, watch some Youtube PHP tutorials and still came up with nothing, and there is also an error telling me that $cols, $rows, $rNumber is undefined. The output should look like a half pyramid.
<?php
do {
$rNumber = mt_rand(3, 11);
} while ($rNumber % 2 == 0);
echo '<strong>Looping Statements Exercises</strong>';
echo '<br>';
echo '<br>';
echo 'This page shows eight (8) figures programatically generated by looping statements. Number of rows are random odd integer between 3 and 11.';
echo '<br>';
echo '<br>';
echo '<table border = "1">';
echo '<tr>';
echo '<td colspan = "4"><center>Size:<strong>', $rNumber, ' x ', $rNumber, '</strong>';
echo '</tr>';
echo '<tr>';
echo '<td> Figure A';
echo '<td> Figure B';
echo '<td> Figure C';
echo '<td> Figure D';
echo '</tr>';
echo '<tr>';
echo '<td> Figure A here';
echo '<td>', figure_b($cols, $rows), '</td>';
echo '<td> Figure C here';
echo '<td> Figure D here';
echo '</tr>';
echo '<tr>';
echo '<td> Figure E';
echo '<td> Figure F';
echo '<td> Figure G';
echo '<td> Figure H';
echo '</tr>';
echo '<tr>';
echo '<td> Figure E here';
echo '<td> Figure F here';
echo '<td> Figure G here';
echo '<td> Figure H here';
echo '</tr>';
function figure_b($rows, $cols)
{
if ($rNumber == 5) {
for ($rows = 0; $rows <= 5; $rows++) {
for ($cols = 0; $cols <= 5; $cols++) {
return $cols;
}
return $rows;
}
}
}
echo '</table>';
Your function:
function figure_b($rows, $cols)
{
if($rNumber == 5)
{
for($rows = 0; $rows<=5; $rows++)
{
for ($cols = 0; $cols<=5; $cols++)
{
return $cols;
}
return $rows;
}
}
}
is completely wrong.
It should be rather:
function figure_b($rNumber)
{
if ($rNumber == 5) {
for ($rows = 0; $rows <= 5; $rows++) {
for ($cols = 0; $cols <= 5; $cols++) {
echo $cols.' ';
}
echo $rows.'<br />';
}
}
}
If you want to display anything inside your table and use rNumber variable (it seems there's no need to pass $rows and $cols variables here)
However your code is really bad, you should not mix PHP code and HTML code that way. If you need to you should move some part of your code to other file and not use so many echo because it also affects your performance.
you can begin by trying to changhe this
$rNumber = mt_rand(3,11);
}while ($rNumber % 2 == 0);
to this :
$rNumber = mt_rand(3,11);
while ($rNumber % 2 == 0);
and your function to :
function figure_b($rNumber)
{
if($rNumber == 5)
{
for($rows = 0; $rows<=5; $rows++)
{
for ($cols = 0; $cols<=5; $cols++)
{
echo $cols;
}
echo $rows;
}
}
}
<?php
do{
$rNumber = mt_rand(3,11);
}while ($rNumber % 2 == 0);
echo '<strong>Looping Statements Exercises</strong>';
echo '<br>';
echo '<br>';
echo 'This page shows eight (8) figures programatically generated by looping statements. Number of rows are random odd integer between 3 and 11.';
echo '<br>';
echo '<br>';
echo '<table border = "1">';
echo '<tr>';
echo '<td colspan = "4"><center>Size:<strong>',$rNumber,' x ',$rNumber,'</strong>';
echo '</tr>';
echo '<tr>';
echo '<td> Figure A';
echo '<td> Figure B';
echo '<td> Figure C';
echo '<td> Figure D';
echo '</tr>';
echo '<tr>';
echo '<td> Figure A here';
echo '<td>', figure_b(5, 5,$rNumber),'</td>';
echo '<td> Figure C here';
echo '<td> Figure D here';
echo '</tr>';
echo '<tr>';
echo '<td> Figure E';
echo '<td> Figure F';
echo '<td> Figure G';
echo '<td> Figure H';
echo '</tr>';
echo '<tr>';
echo '<td> Figure E here';
echo '<td> Figure F here';
echo '<td> Figure G here';
echo '<td> Figure H here';
echo '</tr>';
function figure_b($rows, $cols,$rNumber)
{
if($rNumber == 5)
{
for($rows = 0; $rows<=5; $rows++)
{
for ($cols = 0; $cols<=5; $cols++)
{
return $cols;
}
return $rows;
}
}
}
echo '</table>';
?>

PHP Sorting files in a table

Currently I have a table order by
A B C D
E F G H
but I would like to order the table by
A E
B F
C G
D H
Code:
for($i=0;$i<=count($aFiles);$i++)
{
if($i%5==0)
{
echo "</tr><tr>";
}
echo '<td><a>'.$aFiles[$i].'</a></td>';
}
echo '</tr>';
echo '</table>';
Files are already sorted a-z in $aFiles.
$aFiles = array('a','b','c','d', 'e', 'f', 'g');
$iColumnNumber = 2;
$iRowMaxNumber = ceil(count($aFiles) / $iColumnNumber);
$iTableRow = 0;
$iTableColumns = 1;
$aTableRows = array();
// make array with table cells
foreach ($aFiles as $sFile)
{
if ($iTableRow == $iRowMaxNumber)
{
$iTableRow = 0;
$iTableColumns++;
}
if (!isset($aTableRows[$iTableRow]))
{
$aTableRows[$iTableRow] = array();
}
$aTableRows[$iTableRow][] = '<td>' . $sFile . '</td>';
$iTableRow++;
}
// if there is odd number of elements
// we should add empty td elements
for ($iTableRow; $iTableRow < $iRowMaxNumber; $iTableRow++)
{
if (count($aTableRows[$iTableRow]) < $iTableColumns)
{
$aTableRows[$iTableRow][] ='<td>empty</td>';
}
}
// display table
echo '<table>';
foreach ($aTableRows as $aTableRow)
{
echo '<tr>';
echo implode('', $aTableRow);
echo '</tr>';
}
echo '</table>';
Simple Approach using HTML trick:
echo '<div class="tbl_group"><table>';
for($i=0;$i<=count($aFiles / 2);$i++)
{
echo '<tr>';
echo '<td><a>'.$aFiles[$i].'</a></td>';
echo '</tr>';
}
echo '</tr>';
echo '</table></div>';
echo '<div class="tbl_group"><table>';
for($i=$aFiles / 2;$i<=count($aFiles);$i++)
{
echo '<tr>';
echo '<td><a>'.$aFiles[$i].'</a></td>';
echo '</tr>';
}
echo '</tr>';
echo '</table></div>';
For the CSS:
.tbl_group {
float: left;
}
With this approach, 2 tables are built side-by-side. float: left CSS will auto adjust the position of the tables.
Assuming you know the number of rows you want, you don't need to resort anything, just add some logic in your loop that generates the <td>s :
$size = count($aFiles);
echo '<table><tr>';
for($i=0;$i<=ceil($size/2);$i++) {
if($i%2==0) {
echo '<td><a>'.$aFiles[$i].'</a></td>';
echo "</tr><tr>";
} else {
if(isset($aFiles[$i+floor($size/2)])) {
echo '<td><a>'.$aFiles[$i+floor($size/2)].'</a></td>';
}
}
}
echo '</tr></table>';
Example bellow also works with associative array + arrays with odd elements.
Code for associative AND indexed array :
$aFiles = ['test'=>"A","B",'c'=>"C","D","E","F",'g'=>"G","H",'iii'=>"I"];
$aKeys = array_keys($aFiles);
$aRows = ceil(count($aFiles) / 2);
echo '<table>';
for($i=0; $i < $aRows; $i++) {
echo
'<tr>' .
' <td>' . $aFiles[$aKeys[$i]] . '</td>' .
' <td>' . (isset($aKeys[$i+$aRows]) ? $aFiles[$aKeys[$i+$aRows]] : 'empty') . '</td>' .
'</tr>';
}
echo '</table>';
Code for ONLY indexed array :
$aFiles = ["A","B","C","D","E","F","G","H","I"];
$aRows = ceil(count($aFiles) / 2);
echo "<table>";
for($i=0; $i < $aRows; $i++) {
echo
"<tr>" .
" <td>" . $aFiles[$i] . "</td>" .
" <td>" . (isset($aFiles[$i+$aRows]) ? $aFiles[$i+$aRows] : "empty") . "</td>" .
"</tr>";
}
echo "</table>";
Output for both examples is identical :
<table>
<tr>
<td>A</td>
<td>F</td>
</tr>
<tr>
<td>B</td>
<td>G</td>
</tr>
<tr>
<td>C</td>
<td>H</td>
</tr>
<tr>
<td>D</td>
<td>I</td>
</tr>
<tr>
<td>E</td>
<td>empty</td>
</tr>
</table>
Not optimized, but this should more or less work:
$aFiles = array ("A","B","C","D","E","F","G","H","I","J","K","L","M","N",);
$rows = 4;
$columns = floor((count($aFiles)/$rows))+1;
echo '<table>';
for ($i=0;$i<$rows;$i++) {
echo '<tr>';
for ($j=0;$j<$columns;$j++) {
echo '<td>';
if (isset($aFiles[$i+$j*$rows]))
echo $aFiles[$i+$j*$rows];
else
echo " ";
echo '</td>';
}
echo '</tr>';
}
echo '</table>';
You can change the number of rows if you want.
Try this one. Assume that your $aFiles contains a-z alphabetically.
for ($i = 0; $i < count($aFiles/2); $i++){
echo '<tr><td><a>'.$aFiles[$i].'</a><td><td><a>'.$aFiles[$i+13].'</a><td></tr>'
}

Populate an html table columwise with mysql data

I have a MySQL query that returns data using PHP.
My problem is that I need to populate my html table (with 3 columns) with the data returned by the query but the data should be populated Columnwise.
Like first the first column should be populated .. then the second and finally the third one.
Also I would like to know that is it possible to do so for an unlimited set of data?
Following the screen shot of the desired layout
you can use while.
<table>
$sql=mysql_query("select * from table");
while($s=mysql_fetch_array($sql))
{
$x=$s["x"];
<tr>
<td ><?php echo $x; ?></td>
<td ><?php echo $y; ?></td>
<td ><?php echo $z; ?></td>
</tr>
}
</table>
guybennet's answer is correct but if you want it to work for an unlimited amount of columns you could do this: (I also threw in some column headers for readability)
echo '<table>';
$counter = 0;
$result = mysql_query("select * from table");
while($row = mysql_fetch_array($result)) {
$counter++;
if($counter == 1) {
echo '<tr>';
foreach($row as $key => $val) {
echo "<th>$key</th>";
}
echo '</tr>';
}
echo '<tr>';
foreach($row as $key => $val) {
echo "<td>$val</td>";
}
echo '</tr>';
}
echo '</table>';
Also of course you should use mysqli or PDO I'm just showing a quick example.
If you don't care about how it's organized, you can try something like this:
echo "<table><tr>";
$i=0;
while($row = mysql_fetch_array($sql))
{
echo "<td>".$row[0]."</td>\n";
$i++;
if($i==3)
{
echo "</tr>\n<tr>";
$i=0;
}
}
echo "</tr></table>";
Otherwise, I'd suggest putting it all into an array and then putting it into the table.
$data = array();
$result = mysql_query("SELECT * FROM your_table");
while ($row = mysql_fetch_array($result)) {
$data[] = $row;
}
$itemsAmount = count($data);
$ceilAmount = ($itemsAmount - $itemsAmount % 3) / 3;
$lastAmount = $itemsAmount % 3;
$firstArray = array_slice($data, 0, $itemsAmount);
$secondArray = array_slice($data, 0, $itemsAmount*2);
$thirdArray = array_slice($data, 0, $lastAmount);
$output = "<table>";
foreach ($data as $key => $value) {
$output .= "<tr>";
$output .= "<td>" . $firstArray[$key][0] . "</td>";
$output .= "<td>" . $secondArray[$key][0] . "</td>";
if (empty($thirdArray[$key])) {
$str = '';
} else {
$str = $thirdArray[$key][0];
}
$output .= "<td>" . $str . "</td>";
$output .= "</tr>";
}
$output .= "</table>";
echo $output;
You need to check all the results returned, then print them as you won't print in order:
First get an array with all the results
<?php
$sql= mysql_query('SELECT * FROM table');
$num= mysql_affected_rows($sql);
$items = array();
$i=0;
while($item=mysql_fetch_array($sql)){
$items[++$i]=$item['data'];
}
Now start printing
int $num_rows;
$num_rows=$num%3;
echo '<table>';
for ($i=0;$i<$num_rows;$i++){
echo '<tr>';
for ($j=0;$j<2,$j++){
$n=$i+1+($j*$num_rows);
if($items[$n]!==null)
echo '<td>'.$items[$n].'</td>';
else
echo '<td></td>';
}echo '</tr>';
}echo'</table>';
?>

Categories