2013-07-12 6 views
1

У меня есть запрос mysql, который возвращает массив строк. Как заполнить таблицу html с помощью php по вертикали? нет ограничений на количество столбцов, допустимых для моей таблицы HTML.цикл для заполнения таблицы html по вертикали

Мой запрос MYSQL возвращает около 40 столбцов в строке.

MYSQL row1 => 10|11|12|13|14|15|16|17|18|19 
     row2 => 20|21|22|23|24|25|26|27|28|29 
     row3 => 30|31|32|33|34|35|36|37|38|39 

HTML вывод должен выглядеть следующим образом

10 | 20 | 30 
    11 | 21 | 31 
    12 | 22 | 32 
    13 | 23 | 33 
    14 | 24 | 34 
    15 | 25 | 35 
    16 | 26 | 36 
    17 | 27 | 37 
    18 | 28 | 38 
    19 | 29 | 39 

это мой код, и он не будет отображать ничего.

$values = array(); 

$sql = "SELECT * FROM `TABLE_NAME` ORDER BY `id` ASC LIMIT 0,12"; 
$result = $_db->query($sql); 

$numrows = $_db->num_rows($result); 

$c = 1; 
while ($c <= $numrows) 
{ 
    $values['col_'.$c] = array(); 
    $c++; 
} 

$r = 1; 

while ($row = $_db->fetch_array($result)) 
{ 
    $values['col_'.$c][$r] = $row; 

    $r++; 
} 
echo "<table border='1'>"; 


for ($r = 1; $r <= $numrows; $r++) 
{ 
    echo "<tr>"; 
    for ($c = 1; $c <= sizeof($values['col_1']); $c++) 
    { 
     echo "<td>".$values['col_'.$c][$r]."</td>"; 
    } 
    echo "</tr>" ; 
} 
echo "</table>" ; 

Любая идея, что я делаю неправильно? или как сделать его проще? (я думаю, что слишком много циклов while)

+0

Просто чтобы уточнить: строка из вашей таблицы mysql содержит данные для 1 колонки? – Sumurai8

+0

nope, 1 строка возвращает 30 столбцов. и я хочу отобразить 30 столбцов по вертикали. –

+0

В вашем примере вывода 10 - 19 находятся в 1 колонке (и 10 строках) вашей таблицы html. Являются ли эти данные (от 10 до 19) в 1 строке таблицы MYSQL или 10 строк вашей таблицы MYSQL? – Sumurai8

ответ

4

Я думаю, что вы хотите создать массив PHP из запроса MySQL, транспонировать массив (как вы бы транспонировать матрицу) и отобразить его.

Транспонирование массива является решаемой проблемой (transposing multidimentional arrays in php)

В остальном, это довольно просто ... вот мой код:

$res = mysqli_query(...); 

$anarr = array(); 

while ($row = mysqli_fetch_array($res,$result_type=MYSQLI_ASSOC)){ 

    $anarr[] = $row; 

} 

// here is the transpose part 
array_unshift($anarr, null); 
$transposedarr = call_user_func_array('array_map', $anarr); 
// end of the transpose part 

echo '<table>'; 

foreach ($transposedarr as $r){ 
    echo '<tr>'; 
    foreach ($r as $c){ 
     echo '<td>'.$c.'</td>'; 
    } 
    echo '</tr>'; 
} 

echo '</table>'; 

?> 
+0

спасибо!что делает call_user_func_array()? Я читал его на php.net, но не совсем понял. и почему array_unshift()? не $ anarr [] = $ row; добавить в массив? –

+0

Ох, неважно. я понял. благодаря! –

+0

, как вы можете видеть в ссылке, которую я отправил (просто скопируйте ее с тех пор, как ее лучше объяснили, чем то, что я бы придумал): «первая строка вставляет NULL в качестве первого значения массива. Следующая строка вызывает array_map со всеми записи $ array в качестве параметров. Таким образом, это то же самое, что и вызов array_map (NULL, $ array [0], $ array [1], $ array [2] и т. д. и т. д.). " см. документацию array_map о том, как построить массив массивов, который можно легко выполнить, используя NULL в качестве имени функции обратного вызова « –

0

Вы назначаете только одну строку в своем цикле while. Изменение, что с ниже кодом:

while ($row = $_db->fetch_assoc($result)) 
{ 
    $values['col_'.$c][$r] = $row; 
    $c++; 
    $r++; 
} 

Здесь вы присвоение значения $value['col_1'][$r] и не увеличивая стоимость $c. Поэтому в конце он переопределяет значения.

0

Вы можете упростить задачу, просто говоря

$values[$rowIndex] = $columnArray

Так что в этом случае

$values[0] = array(10, 20, 30); 
$values[1] = array(11, 21, 31); 

А затем цикл по каждому массиву

echo "<table border='1'>"; 
foreach($values as $row) 
{ 
    echo "<tr>"; 
    foreach($row as $columnValue) 
    { 
     echo ..whatever.. 
    } 
    echo "<tr>"; 
} 
echo "</table>" ; 

Или что-то вдоль этих линий , Я просто в основном psuedo закодировал это, хотя сейчас у меня нет доступа к php-интерпретатору.

0

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

например. (испытания):

$sql = "SELECT * FROM `TABLE_NAME` ORDER BY `id` ASC LIMIT 0,12"; 
$result = $_db->query($sql); 

echo "<table border='1'>"; 

$tab = array(); 
while ($row = $result->fetch_row()) 
{ 
    $tab[] = $row; 
} 

for($i = 0, $l = count($tab[$i]); $i < $l; $i++){ 
    echo "<tr>"; 
    for($j = 0, $m = count($tab); $j < $m; $j++){ 
     echo "<td>".$tab[$j][$i]."</td>"; 
    } 
    echo "</tr>" ; 
} 

echo "</table>"; 

UPDATE: Я полностью изменил код. Сначала я не понял, что вам нужно.

Помогает ли этот код?

+0

, отображая каждую строку массива по горизонтали. 11 | 12 | 13 21 | 22 | 23 и так далее –

+0

хмм .. выход должен быть <12 .. и так далее .. но я не могу проверить это сейчас , вы попробовали? наверняка это не может быть так, как вы сказали, потому что должно быть также s –

+0

@ user2035819 вы его протестировали? –

-1
<?php 

$arr = array(array(1,2,3,4,5,6,7,8,9), array(10,11 etc . . . 

for($i = 0; $i < 9; ++ $i){ 

    for($x = 0; $x < $num_rows; ++ $x){ 

     echo $arr[$x][$i]; 

    } 
    echo '<br/>'; 

} 

?> 

U может заменить 9 с числом столбцов в таблицах

Я не уверен, что этот код правильно (не может проверить сейчас), но я думаю, что это может помочь вам Извините, если я что-то сделать не так, я просто пытаюсь помочь

0
//while and foreach loop can do this 
<?php 

$values = array(); 

$sql = "SELECT * FROM `TABLE_NAME` ORDER BY `id` ASC LIMIT 0,12"; 
$result = $_db->query($sql); 

$numrows = $_db->num_rows($result); 

//check here 
if($numrows>0) 
{ 
    //1 row 
    $r = 1; 
    //column 
    $c=0; 

    while ($row = $_db->fetch_assoc($result)) 
    { 
     //value row column 
     $values[$r][$c] = $row; 

     //column == 3 
     if($c==2) 
     { 
      //increase row 
      $r++; 
      //reset column 
      $c = 0; 

     }else{ 

      $c++; 
     } 
    } 
    echo "<table border='1'>"; 


    //display row and columns 
    foreach($values as $row) 
    { 
     echo "<tr>"; 
     echo "<td>".$values[0]."</td>"; 
     echo "<td>".$values[1]."</td>"; 
     echo "<td>".$values[2]."</td>"; 
     echo "</tr>" ; 
    } 
    echo "</table>" ; 
} 
+0

все это echo's is "array" –

+0

$ value - это $ row, что вы хотите напечатать в этой строке $ .. вы didn ' t упоминать что-нибудь .. $ value [0] ['field_name по вашему выбору]; – Sundar

0

Это, как я хотел бы справиться с ней. Самая сложная часть - это подготовка структуры, в которой вы готовите стол. Он использует следующий синтаксис: $somearray[] = $x, который добавляет $x в массив $somearray. implode() объединяет массив вместе со строкой, которую вы определяете. И последнее, но не менее важное: вы использовали mysql_fetch_assoc, который возвращает ассоциативный массив (Array([column1] => "val1"); и т. Д.). Вместо этого вы хотите иметь нумерованный массив для этих операций. Это может быть выполнено с помощью mysql_fetch_array со вторым аргументом MYSQL_NUM.

$arrayOfRows = Array(); 

$sql = "SELECT * FROM `TABLE_NAME` ORDER BY `id` ASC LIMIT 0,12"; 
$result = $_db->query($sql); 

$firstrun = true; 
while($row = $_db->fetch_array($result, MYSQL_NUM)) { 
    #Setup structure on first run 
    if($firstrun) { 
    $firstrun = false; 
    for($i = 0; $i < count($row); $i++) { 
     $arrayOfRows[$i] = Array(); 
    } 
    } 

    #Each field in this mysql row needs to be in a different html row 
    foreach($row as $k => $v) { 
    $arrayOfRows[$k][] = $v; 
    } 
} 

#Now simply print it 
echo '<table>'; 

foreach($arrayOfRows as $k => $row) { 
    echo '<tr>'; 
    echo '<td>' . implode('</td><td>', $row) . '</td>'; 
    echo '</tr>'; 
} 

echo '</table>'; 
Смежные вопросы