Группировка данных на основе их значений - PullRequest
0 голосов
/ 08 октября 2018

Я хочу группировать и отображать данные (числа) через запятую в ячейках в HTML-таблице.Я хочу сгруппировать данные на основе их значений.Так что, если есть числа от 1 до 20, они будут в первом столбце, как 6,10,11,12,15,17.Как я могу достичь этого легко?Спасибо.

Мой код такой:

   <table class="tbstyle">
        <tr>
        <th>1-20</th> 
        <th>21-40</th>
        <th>41-60</th>
        <th>61-80</th>
        <th>81-100</th>
        </tr>

        <?php

          include ("config.php");   
          $sql = "SELECT Rpa, Rpb, Rpc, Rpd, Rpe, Rpf, Rpg, Rph, Rpi, Rpj, Rpk, Rpl, Rpm, Rpn, Rpo, Rpp, Rpq, Rpr FROM RpDb";
          $result = $conn->query($sql);
          if ($result->num_rows > 0) {
           while($row = $result->fetch_assoc()) 
           {

//I am stuck in this part.  

           }  
              echo "</table>";

        } else { echo "0 results"; }
        $conn->close();
            ?>   

        </table>

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

Вот относительно простое решение с использованием array_reduce:

$rows = array(
    array(1, 30, 40, 22, 12, 14, 55, 68, 91, 80, 99, 23, 63, 61, 83),
    array(8, 17, 59, 14, 93, 31, 57, 91, 29, 38, 54, 47, 28, 12, 15)
    );

// replace this line with your while($row = $result->fetch_assoc()) 
foreach ($rows as $row) {
    echo "<tr>";
    sort($row);
    $groups = array_reduce($row, function ($c, $v) { $c[(int)floor(($v-1) / 20)][] = $v; return $c; }, array());
    for ($i = 0; $i < 5; $i++) {
        echo "<td>" . implode(',', isset($groups[$i]) ? $groups[$i] : array()) . "</td>";
    }
    echo "</tr>\n";
}

Вывод:

<tr><td>1,12,14</td><td>22,23,30,40</td><td>55</td><td>61,63,68,80</td><td>83,91,99</td></tr> 
<tr><td>8,12,14,15,17</td><td>28,29,31,38</td><td>47,54,57,59</td><td></td><td>91,93</td></tr>
0 голосов
/ 08 октября 2018

Хорошо, поэтому, исходя из моего понимания вашего вопроса, вы хотите получить все числа (данные) из всех ваших столбцов в вашей базе данных и упорядочить их в своей таблице, так что это пример того, как это сделать: -

...
$num_list = array();
if ($result->num_rows > 0)
   while($row = $result->fetch_assoc()) 
       foreach ($row as $value)
           array_push($num_list, $value);

//sort the numbers
sort($num_list);

//insert them into the table
for($i=1; $i<=100; $i+=20){
    $res = "";
    //store the numbers between these indexes into this string
    foreach($num_list as $value)
        if($value >= $i && $value < $i+20)
            $res .= $value . ", ";
    //remove the end comma
    if(strlen($res) != 0)
        $res = substr($res, 0, -1);
    //echo the data
    echo "<td>$res</td>\n";
}
...

Редактировать

Я не понимаю этого разговора Я хочу группировать и отображать данные (числа) через запятую в ячейках , потому что вы сказалив приведенном ниже комментарии вы не хотите, чтобы значения запятых разделялись в одной ячейке, поэтому я пытаюсь разделить результаты на строки , но не разделяя их запятыми или чем-то еще , поэтому давайте попробуем сделатьнекоторые изменения в моем коде перед вставкой for loop: -

...
$all_values = array();

//insert them into the table(old comment)
//insert them into the array(new comment)
for($i=1; $i<=100; $i+=20){
    //insert an array into the array
    array_push($all_values, array());
    //store the numbers between these indexes into this array
    foreach($num_list as $value)
        if($value >= $i && $value < $i+20)
            array_push($all_values[count($all_values)-1], $value);
}

//Getting the count of the longest group of numbers and sorting them
$longet_length = 0;
foreach($all_values as $value){
    sort($value);
    if(count($value) > $longet_length)
        $longet_length = count($value);
}

//Finally insert them into the table
$current_index = 0;
while($current_index < $longet_length){
    echo "<tr>\n";
    foreach($all_values as $value)
        if(count($value) > $current_index)
            echo "<td>{$value[$current_index]}</td>\n";
        else
            echo "<td>Empty</td>\n";
    echo "</tr>\n";

    $current_index++;
}
...
0 голосов
/ 08 октября 2018

это было непроверено и вне предела, однако базовая логика того, что я думаю, вы пытаетесь достичь, есть.Дайте мне знать, если есть какие-либо вопросы, и я исправлю ответ.

$row_nums = array_values($row);
asort($row_nums);

$grouped_scores = [];

foreach($row_nums as $num){

    switch (true) {
      case  ($num <= 20):
        $grouped_scores[1][] = $num;
        break;
      case  ($num > 20 && $num <= 40):
        $grouped_scores[2][] = $num;
        break;
      case  ($num > 40 && $num <= 60):
        $grouped_scores[3][] = $num;
        break;
      case  ($num > 60 && $num <= 80):
        $grouped_scores[4][] = $num;
        break;
      case  ($num > 80):
        $grouped_scores[5][] = $num;
        break;
    }

}

echo '<tr>';

foreach($grouped_scores as $score_array){

    echo '<td>'.implode(',', $score_array).'</td>';
}

echo '</tr>';
0 голосов
/ 08 октября 2018

Вот фрагмент кода, который делает то, что я думаю, вы хотите выполнить.Возможно, есть более быстрые способы (с меньшим количеством циклов), но это делает свою работу.

<?php

$borders = [20,40,60,80];
// some test data
$rows[] = ["Rpa" => 30, "Rpb" => 14, "Rpc" => 1, "Rpd" => 24];
$rows[] = ["Rpa" => 41, "Rpb" => 33, "Rpc" => 20, "Rpd" => 79];


$grouprows = []; // we'll need some array to re-structure your rows.
foreach($rows as $row) { // this is your while($row = $result->fetch_assoc())
    $groups = []; // the former columns will be packed into "groups" (1-20, 21-40,..)
    foreach($row as $column => $value) {  // walk through all Rpa, Rpb, ...
        foreach($borders as $i => $border) {   // walk through the borders (<20, <40, <60,..)
            if($value <= $border) {  // if it fits into the current group/border, add it to that group
                $groups[$border][] = "$column: $value";
                break;  // ..and don't look any further
            }
        }
        ksort($groups);  // sort the groups to be ascending
    }
    $grouprows[] = $groups;  // add the just edited row to the main array
}

// actual output
echo "<table border=1>
        <tr>
        <th>1-20</th> 
        <th>21-40</th>
        <th>41-60</th>
        <th>61-80</th>
        <th>81-100</th>
        </tr>";

foreach($grouprows as $row) {
    echo "<tr>\n";
    $colcount = 0;
    foreach($row as $col) {

        if(is_array($col)) {
            echo "\t<td>" . implode(", ",$col) . "</td>\n";
        } else {
            echo "\t<td></td>\n";
        }
        $colcount++;
    }
    // if we haven't filled all column yet (because there were no fitting values), add empty tds
    for($colcount;$colcount<count($borders);$colcount++) {
        echo "\t<td></td>\n";
    }
    echo "</tr>\n"; 
}
echo "</table>";

Фрагмент: https://3v4l.org/SFPBW

Вывод:

<table border=1>
        <tr>
        <th>1-20</th> 
        <th>21-40</th>
        <th>41-60</th>
        <th>61-80</th>
        <th>81-100</th>
        </tr>
<tr>
    <td>Rpb: 14,Rpc: 1</td>
    <td>Rpa: 30,Rpd: 24</td>
    <td></td>
    <td></td>
</tr>
<tr>
    <td>Rpc: 20</td>
    <td>Rpb: 33</td>
    <td>Rpa: 41</td>
    <td>Rpd: 79</td>
</tr>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...