За последние 24 часа нас посетили 52253 программиста и 1763 робота. Сейчас ищут 1010 программистов ...

разбиение таблицы, построенной из csv, на стрыницы

Тема в разделе "PHP для новичков", создана пользователем graf_vorontsov, 12 фев 2011.

  1. graf_vorontsov

    graf_vorontsov Активный пользователь

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    подскажите пожалуйста. не могу решить такую задачу:
    есть файл csv(большой список 5000 позиций)
    есть скрипт, выводящий этот файл в виду таблицы
    PHP:
    1. <?php
    2.         $data = File("33.csv");
    3.         echo "<b><h2><center>Прайс-лист</b></h2></center>";
    4.         echo "<center><table border=0><tr>";
    5.         $dat_arr = explode(";", $data[0]);
    6.         //первая строка таблицы
    7.         for ($p=0;$p<count($dat_arr);$p++) {
    8.             echo "<td bgcolor=lightblue><center><b>$dat_arr[$p]";
    9.         }
    10.         echo "</tr>";      
    11.         //следующие строки
    12.         for ($i=1;$i<count($data);$i++) {
    13.             $data_array = explode(";", $data[$i]);
    14.             echo "<tr>";
    15.             for ($f=0;$f<count($data_array);$f++) {
    16.                 echo "<td bgcolor=orange><center><b>$data_array[$f]";
    17.             }
    18.             echo "</tr>";
    19.         }
    20.         echo "</table></center>"; //конец таблицы данных
    21. ?>
    таблица получается хорошая, но очень длинная, поэтому решил разбить её на страницы, хоть по 300 позиций.
    нашёл скрипт разбиения на страницы (работает нормально только если сам по себе без скрипта предыдущего), а вместе не пойму как заставить их работать.
    Я начинающий ПХП-шник и зашёл в тупик, подставлял в разные части скрипта, менял переменные - ничего :(
    PHP:
    1. <?php
    2. $array = file('33.csv');
    3. $count = count($array);
    4. $list  = 10;
    5.  
    6. if (empty($_GET['page'])) {
    7.     $page = 1;
    8. } else {
    9.     $page = (int) $_GET['page'];
    10. }
    11.  
    12. $j = ($count-1)-(($page-1)*$list);
    13. $i = $j-$list;
    14.  
    15. for(; $i<$j && $j>=0; $j--) {
    16.     echo $array[$j];
    17. }
    18. echo '<font color="#ffffff" size="5">Страницы:&nbsp;</font>'."\n";
    19. $all = ceil($count/$list);
    20. for ($i=1;$i<=$all;$i++) {
    21.     if ($page==$i) {
    22.         echo '<strong><font color="#ffffff">'.$i.'</font></strong> ';
    23.     } else {
    24.         echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a> '."\n";
    25.     }
    26. }
    27. ?>
    хотелось бы сделать ещё чтоб первая строчка оставалась на каждой странице одна и та же(шапка таблицы), но для начала надо разобраться с постраничным выводом таблицы.
    И ещё вопрос: по тому пути ли я пошёл?
    У меня есть файл csv(прайс-лист), вывожу его на страничку сайта следующим образом.
    -удобно ли будет сделать поиск по этим данным если они будут разбиты на несколько страниц?
    -А может лучше загрузить его в БД и строить таблицу оттуда?
    -или может лучше сделать поиск по файлу без вывода его на страницу сайта, а выводить только запрашиваемую информацию пользователем из файла с помощью поиска?
     
  2. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    1)Я бы загрузил бы данные в таблицу и использовал SQL для выборки и поиска. Если использовать файл напрямую, то все придется кодировать самому
    2) для считывания данных из CSV файла я бы использовал функцию fgetcsv
    3) про постраничную навигацию можешь почитать здесь
    http://www.php.ru/forum/viewtopic.php?t=30703
     
  3. graf_vorontsov

    graf_vorontsov Активный пользователь

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    да, наверное буду грузить в БД...
     
  4. graf_vorontsov

    graf_vorontsov Активный пользователь

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    решил разбираться по порядку:
    попытался сделать вывод через fgetcsv и вот что получилось
    PHP:
    1. <?php
    2.     $handle = fopen("33.csv", "r");
    3.     echo "<center><table>";    
    4.     while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    5.         echo "<tr>";
    6.         echo "<td bgcolor=lightblue>$data[0]</td><td bgcolor=yellow>$data[1]</td><td bgcolor=lightgreen>$data[2]</td><td>$data[3]</td><td bgcolor=orange>$data[4]</td>";
    7.         echo "</tr>";
    8.         //echo "$data[0] <br>";
    9.         //echo "$data[1] <br>";
    10.         //echo "$data[2] <br>";
    11.         //echo "$data[3] <br>";
    12.         //echo "$data[4] <br>\n";
    13.     }
    14.     echo "</table></center>";
    15.     fclose($handle);
    16. ?>
    почему сделал так?
    PHP:
    1. echo "<td bgcolor=lightblue>$data[0]</td><td bgcolor=yellow>$data[1]</td><td bgcolor=lightgreen>$data[2]</td><td>$data[3]</td><td bgcolor=orange>$data[4]</td>";
    потому что
    PHP:
    1.  
    2.         echo "$data[0] <br>";
    3.         echo "$data[1] <br>";
    4.         echo "$data[2] <br>";
    5.         echo "$data[3] <br>";
    6.  
    выводит данные по столбцам!!! хотя в мануале к функции fgetcsv написано что выводится построчно...
    таблица рисуется красиво, но по столбцам.
    объясните пожалуйста кому не трудно.
     
  5. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    1) fgetcsv считывает строку Excel в массив
    2) выводит "по столбцам" из-за <br>.
    Если хочешь вывести строку в строку то нужно вот так
    PHP:
    1.  
    2. echo "$data[0] $data[1]  $data[2]  $data[3] <br>";
    3.  
     
  6. graf_vorontsov

    graf_vorontsov Активный пользователь

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    нет проблема точно не в <br>, если убираю его то выводит просто первый столбик в строку.
    вот кусок файла csv
    Код (Text):
    1. Оригинальный №;Неоригинальный №;Наименование;Производитель;Цена
    2. 2K0 511 413 D;;Втулка стабилизатора;VAG;28,88
    3. 321 498 625 E;EVR5426;Подшипник;Ruville;213,26
    4. 321 615 301 D;24.0120-0128.1;Диск тормозной;ATE;333,84
    5. 333 513 425;FE08071;Пыльник;Febi;30,47
    6. 357 121 140;;Заглушка;VAG;38,44
    7. 357 199 402 B;10188 01;Подушка;Lemforder;264,61
    8. 256 725 301 J;;Бумага;Epson;256,3
    9. 256 725 301 J;;Бумага;Epson;256,3
    10. 357 407 182;10203 01;С/блок;Lemforder;24,88
    11. 357 412 329;10240 01;Опора;Lemforder;78,32
    12. 2K0 511 413 D;;Втулка стабилизатора;VAG;28,88
    13. 321 498 625 E;EVR5426;Подшипник;Ruville;213,26
    14. 321 615 301 D;24.0120-0128.1;Диск тормозной;ATE;333,84
    15. 333 513 425;FE08071;Пыльник;Febi;30,47
    16. 357 121 140;;Заглушка;VAG;38,44
    вот вывод команды print_r($data);
    Код (Text):
    1.  
    2. Array
    3. (
    4.     [0] => Оригинальный №
    5.     [1] => Неоригинальный №
    6.     [2] => Наименование
    7.     [3] => Производитель
    8.     [4] => Цена
    9. )
    10. Array
    11. (
    12.     [0] => 2K0 511 413 D
    13.     [1] =>
    14.     [2] => Втулка стабилизатора
    15.     [3] => VAG
    16.     [4] => 28,88
    17. )
    18. Array
    19. (
    20.     [0] => 321 498 625 E
    21.     [1] => EVR5426
    22.     [2] => Подшипник
    23.     [3] => Ruville
    24.     [4] => 213,26
    25. )
    26. Array
    27. (
    28.     [0] => 321 615 301 D
    29.     [1] => 24.0120-0128.1
    30.     [2] => Диск тормозной
    31.     [3] => ATE
    32.     [4] => 333,84
    33. )
    34. Array
    35. (
    36.     [0] => 333 513 425
    37.     [1] => FE08071
    38.     [2] => Пыльник
    39.     [3] => Febi
    40.     [4] => 30,47
    41. )
    42. Array
    43. (
    44.     [0] => 357 121 140
    45.     [1] =>
    46.     [2] => Заглушка
    47.     [3] => VAG
    48.     [4] => 38,44
    49. )
    50. Array
    51. (
    52.     [0] => 357 199 402 B
    53.     [1] => 10188 01
    54.     [2] => Подушка
    55.     [3] => Lemforder
    56.     [4] => 264,61
    57. )
    58. Array
    59. (
    60.     [0] => 256 725 301 J
    61.     [1] =>
    62.     [2] => Бумага
    63.     [3] => Epson
    64.     [4] => 256,3
    65. )
     
  7. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    так в чём проблема?.. вы реально получили на один массив одну строку.

    чтобы вывести данные, нужно сделать что-то вроде:
    PHP:
    1. <?php
    2. foreach ($data as $line)
    3. {
    4.   foreach ($line as $cell)
    5.      { echo "$cell "; }
    6.   echo "<br>";
    7. }
    8. ?>
     
  8. graf_vorontsov

    graf_vorontsov Активный пользователь

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    сделал так и вот результат:
    Warning: Invalid argument supplied for foreach() in Z:\home\test1.ru\www\price.php on line 11

    это значит что нет такой переменной или пустой массив как я понял...
     
  9. graf_vorontsov

    graf_vorontsov Активный пользователь

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    всё, сделал так
    PHP:
    1. <?php
    2.         $handle = fopen("33.csv", "r");
    3.          echo "<center><table>";
    4.          echo "<tr>";  
    5.          while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    6.             foreach($data as $value){
    7.                     echo "<td>$value</td>";                                  
    8.             }
    9.          echo "<tr>";
    10.         }        
    11.         echo "</table></center>";
    12.         fclose($handle);
    13. ?>
    но всеравно хотел бы понять почему не работало по другому....
     
  10. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    лучше поправить (правильно закрыл теги и вынес каждую строку - вам же удобнее):

    PHP:
    1. <?php
    2.         $handle = fopen("33.csv", "r");
    3.          echo "<center><table>";
    4.          while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    5.             echo "\r\n<tr>";
    6.             foreach($data as $value){
    7.                     echo "<td>$value</td>";
    8.             }
    9.          echo "</tr>";
    10.         }        
    11.         echo "\r\n</table></center>";
    12.         fclose($handle);
    13. ?>
     
  11. graf_vorontsov

    graf_vorontsov Активный пользователь

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков