2012-05-11 2 views
1

Допустим, вы получили представление таблицы, как этототображения таблицы MySQL вертикально - для сравнения или для распечатки целей

seed_id  name   country 
-------  ----------  ------- 

1   John   America 
2   Jose   Mexico 
3   Khan   Pakistan 

и вы хотели бы, чтобы нарисовать HMTL вертикально следующим образом;

seed_id  1    2   3 
name  John   Jose  Khan 
country  America  Mexico  Pakistan 

Этот вид очень удобен в двух случаях.

Вы хотите распечатать табличный вид или сравнить поля рядом друг с другом.

В режиме печати, на столе с 50 полями, даже при печати одного вида записи, вы не получите доступную для просмотра распечатку. Бумага вырезает печать на 10-ом поле или около того.

но с вертикальным видом не имеет значения, сколько полей имеет стол.

Точно так же, когда вы сравниваете записей бок о бок, как в этом прекрасном примере

http://www.dpreview.com/products/compare/side-by-side?products=nikon_d90&products=nikon_d3&products=nikon_d4&sortDir=ascending

вы получите очень полезный вид.

Я могу сесть, чтобы написать эту библиотечную функцию сейчас, но у меня нет времени в данный момент. Но я уверен, что у кого-то там есть время или уже написано. Не могли бы вы поделиться им, пожалуйста?

getview ($ dbh, "select * from tableX где 1 = 1", "vertical");

ответ

0

Там, вероятно, лучший способ, что зацикливание ...

$table = array(); 
foreach($result_row as $row) 
{ 
    foreach(array('seed_id','name','country') as $index) 
    { 
    $table[$index][] = $row[$index]; 
    } 
} 

Нечто подобное должно реорганизовать свой массив в структуру, которую вы должны были бы

+1

См http://stackoverflow.com/a/3423692/623041 – eggyal

+0

Ха, это довольно трусливый! – Scuzzy

6

Вы можете использовать \G флаг.

SELECT * FROM mytbl \G 

UPD: образец статьи: http://slaptijack.com/software/enabling-vertical-g-output-in-the-mysql-client/

+0

Это специфичный для клиента (он работает в инструменте командной строки ['mysql'] (http://dev.mysql.com/doc/en/mysql.html), но, вероятно, не в PHP?). – eggyal

+0

Я не совсем уверен, лучше попробовать. – deadrunk

+0

Это должно быть для интерфейса командной строки. Причина, когда я пробовал это в mysql_query в PHP-коде, возвращается с синтаксической ошибкой. –

0

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

В любом случае, я пробовал вашу ссылку. (то есть Transposing multidimensional arrays in PHP) Но, это не работает для моего дела.

Вы можете попробовать его сами и увидеть. Я приложил две функции, необходимые для этого. Все, что вам нужно, это соединение mysql $ dbh, чтобы дать этой функции идти. Вы увидите, что в моей функции я использовал функцию flipdiagonally, которая была проголосована 24 раза в этой ссылке.

Когда вы вызываете функцию с $ direction_v_or_h, установленным на h,, она работает. но это не новость для нас. Это режим v, которым я пользуюсь.

Попробуйте его с пределом, как это

SQL_getview($dbh, "select * from yourTable limit 2","h"); 

и

SQL_getview($dbh, "select * from yourTable limit 2","v"); 

ошибка, что я получаю это; повторяется для каждого поля в таблице

Warning: Invalid argument supplied for foreach() in D:\Hosting\5291100\html\blueprint\sql.php on line 739 



function SQL_getview($dbh,$sql,$direction_v_or_h = 'h') 

{ 

    $result = $result = mysql_query($sql,$dbh); 

    $fields_num = mysql_num_fields($result); 

    if ($direction_v_or_h == "h"): 
     echo "<table border='1'><tr>"; 
     // printing table headers 
     for($i=0; $i<$fields_num; $i++) 
     { 
       $field = mysql_fetch_field($result); 
       echo "<td>{$field->name}</td>"; 
     } 
     echo "</tr>\n"; 
     while($row = mysql_fetch_row($result)) 
     { 
       echo "<tr>"; 
       foreach($row as $cell) 
         echo "<td>$cell</td>"; 
         echo "</tr>\n"; 
     } 
     echo "</table>"; 
    else: 
     if (1): //turn this to 0 to see the good old print_r workaround 
      echo "<table border='1'><tr>"; 
      // printing table headers 
      for($i=0; $i<$fields_num; $i++) 
      { 
        $field = mysql_fetch_field($result); 
        echo "<td>{$field->name}</td>"; 
      } 
      echo "</tr>\n"; 
      while($row = mysql_fetch_assoc($result)) 
      { 
        echo "<tr>"; 
         $row = flipDiagonally($row);     

        foreach($row as $cell) 
          echo "<td>$cell</td>"; 
          echo "</tr>\n"; 
      } 
      echo "</table>"; 
     else: 
      while($row = mysql_fetch_assoc($result)) 
      { 
        echo "<tr>"; 
        echo "<pre>"; 
        print_r ($row); 
        echo "</pre>"; 
        echo "<hr>"; 
      } 

     endif; 
    endif; 
    mysql_free_result($result); 
} 


function flipDiagonally($arr) { 
    $out = array(); 
    foreach ($arr as $key => $subarr) { 
     foreach ($subarr as $subkey => $subvalue) { 
       $out[$subkey][$key] = $subvalue; 
     } 
    } 
    return $out; 
} 
+0

FYI Если вы хотите добавить последующие действия, как это, вы можете отредактировать исходный вопрос и включить его там. Во-первых, ваша функция «flipDiagonally» не является кодом из ответа на который я связывал (который использует «array_map» для переноса массива); во-вторых, вам нужно будет вызвать 'flipDiagonally' в массиве всего набора результатов, а не в одной строке (используя библиотеку' mysql_ * ', я думаю, вам сначала нужно построить такой массив, перейдя по результатам, но если вместо этого вы используете PDO - и вы действительно * должны * - тогда вы можете просто использовать ['fetchAll'] (http://www.php.net/manual/en/pdostatement.fetchall.php)) – eggyal

Смежные вопросы