Строка Foreach отображается как столбец - PullRequest
1 голос
/ 18 января 2012

У меня есть довольно стандартная база данных, как:

id | name | last_name                | gender 
-----------------------------------------------
1  | John | Doe                      | Male
2  | Jane | Smith Dolores Clayborne  | Female
3  | Paul | Paulson                  | Male

и я хочу отобразить его в таблице, но каждая строка в БД должна быть столбцом в таблице HTML:

id        | 1         | 2         | 3      
---------------------------------------------
name      | John      | Jane      | Paul
---------------------------------------------
last_name | Doe       | Smith     | Paulson
          |           | Dolores   |
          |           | Clayborne |
---------------------------------------------
gender    | Male      | Female    | Male 

Если я пойду с:

foreach($data as $row) {
echo "<tr><td>" . $row->id . "</td></tr>";
echo "<tr><td>" . $row->name . "</td></tr>";
echo "<tr><td>" . $row->last_name . "</td></tr>";
echo "<tr><td>" . $row->gender . "</td></tr>";
}

Я получаю все данные в одном длинном столбце. Как разбить столбец после каждой строки SQL?

Примечание: $data - это массив объектов, которые содержат свойства со значениями полей (вы, вероятно, можете понять это из примера).

EDIT:

Я нашел решение, см. Мой ответ, оно простое и элегантное.

Ответы [ 6 ]

4 голосов
/ 19 января 2012

Я понял, оказывается, это довольно простое решение с несколькими циклами и предварительным заполнением массива перед записью строк и ячеек.

Я проверил, работает как шарм. ;) Это может быть кому-то полезно, поэтому вот оно:

foreach($records as $key => $row) {
       foreach($row as $field => $value) { 
           $recNew[$field][] = $value;
       }
}
//This creates a new array composed/transposed with the field names as keys and
//the "rowed" values as sub-arrays.

echo "<table>\n";

foreach ($recNew as $key => $values) // For every field name (id, name, last_name, gender)
{
    echo "<tr>\n"; // start the row
    echo "\t<td>" . $key . "</td>\n" ; // create a table cell with the field name
        foreach ($values as $cell) // for every sub-array iterate through all values
        {
           echo "\t<td>" . $cell . "</td>\n"; // write cells next to each other
        }
    echo "</tr>\n"; // end row

}

echo "</table>";
2 голосов
/ 18 января 2012

Ответ был обновлен для скорректированных исходных требований к должности следующим образом:

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

http://www.bluevineconsulting.com/table_test.php

он имеет метод php div сверху и действительно показывает, что div имеют разные размеры, как вы надеялись, не произойдет. Однако я придумала элегантное / уродливое решение, которое работает с таблицей.

// i populated a fake object so i could test with it
$data = new stdClass();
$data->student1->id = "1";
$data->student1->name = "Test1";
$data->student1->last_name = "User1";
$data->student1->gender = "Male";
$data->student2->id = "2";
$data->student2->name = "Test";
$data->student2->last_name = "User<br>\nMaiden<br>\nOther\n";
$data->student2->gender = "Female";
$data->student3->id = "3";
$data->student3->name = "Test3";
$data->student3->last_name = "User3";
$data->student3->gender = "Male";
$data->student4->id = "4";
$data->student4->name = "Test4";
$data->student4->last_name = "User4";
$data->student4->gender = "Female";
$data->student5->id = "5";
$data->student5->name = "Test5";
$data->student5->last_name = "User5";
$data->student5->gender = "Female";
$data->student6->id = "6";
$data->student6->name = "Test6";
$data->student6->last_name = "User6";
$data->student6->gender = "Female";
$datacount = count($data);


foreach($data as $row) {
    $datacount++;
    if (empty($colcount)) {
        foreach ($row as $key => $val) {
            $colcount++;
            $keyname[$colcount] = $key;
        }
        echo "Columns = ".$colcount."<br>\n";
     }
}
echo "records = ".$datacount."<br>\n<br>\n";
echo ("<b>PHP Table method:</b><br>\n<br>\n");
echo ("<table border='1px' cellspacing='0'>\n");
foreach ($keyname as $key) {
    echo "    <tr style='vertical-align:top;'>\n";
    for ($d = 1; $d < $datacount; $d++) {
        $id = "student".$d;
        echo "        <td>".$data->$id->$key."</td>\n";
     }
    echo "    </tr>\n";
}
echo ("</table>\n");

Я должен признать, что это странно, но при этом ваши таблицы будут иметь правильную высоту. Следующая более сложная часть - установить количество отображаемых столбцов, так как этот метод значительно усложняет разбиение после 5 столбцов, например метод div у меня был ранее.

0 голосов
/ 24 августа 2017

Я надеюсь, что это сработает, и мы можем избежать нежелательного цикла for.

foreach ($ data as $ row) {

$idRow .= '<td>' . $row->id . '</td>';

$nameRow .= '<td>' . $row->name . '</td>';

$lastNmaeRow .= '<td>' . $row->last_name . '</td>';

$genderRow .=  '<td>' . $row->gender . '</td>';

}

 <tr><td>Id</td>'.$idRow.'</tr>
 <tr><td>Name</td>'.$nameRow.'</tr>
 <tr><td>Last Name</td>'.$lastNmaeRow.'</tr>
 <tr><td>Gender</td>'.$genderRow.'</tr>
0 голосов
/ 01 ноября 2015

Самый простой способ - выполнить этот запрос в div и некотором стиле, поэтому код будет

<div align="center" style="float:left; width:100px; ">
<?    
$query = "select Something from your database";
$result = mysql_query($query);  
$results = mysql_num_rows($result);

//Now run the loop
for($i=0; $i<$results; $i++)
{   
echo'<div align="center" style="float:left; width:100px;">';
$records=mysql_fetch_assoc($result);
    foreach($records as $item)
    {
    echo'<div style="float:left;">'.$item.'</div>'; 
    }
echo '</div>';
}
?>
</div>
0 голосов
/ 18 января 2012

Это низкотехнологичное решение, но его может быть достаточно.

$fmt="<tr><td>%s<br/>%s<br/>%s<br/>%s</td></tr>\n";
foreach($data as $row) {
  printf($fmt, $row->id, $row->name, $row->lastname, $row->gender);
}
0 голосов
/ 18 января 2012

Вы должны использовать "\ n" в конце каждого столбца в новой строке и "\ t" для вкладок:

foreach($data as $row) {

    echo "\t<tr><td>" . $row->id . "</td></tr>\n";
    echo "\t<tr><td>" . $row->name . "</td></tr>\n";
    echo "\t<tr><td>" . $row->last_name . "</td></tr>\n";
    echo "\t<tr><td>" . $row->gender . "</td></tr>\n";

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...