За последние 24 часа нас посетили 20707 программистов и 1106 роботов. Сейчас ищут 360 программистов ...

Таблица с применением rowspan в цикле PHP

Тема в разделе "Сделайте за меня", создана пользователем Михаил77, 25 ноя 2019.

Метки:
  1. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0
    Добрый вечер!

    Подскажите пожалуйста как можно реализовать формирование таблицы из массива в цикле
    где первая ячейка будет объединять две строки?

    Заранее благодарю!

    Массив
    PHP:
    1. <?
    2. $array = array (
    3. "Один",
    4. "Два",
    5. "Три",
    6. "Четыре",
    7. "Пять",
    8. );
    9. ?>
    На выходе нужно получить такую таблицу

    HTML:
    1. <tr>
    2. <td rowspan="2"> Один </td>
    3. <td> Два </td>
    4. <td> Три </td>
    5. </tr>
    6. <tr>
    7. <td> Четыре </td>
    8. <td> Пять </td>
    9. </tr>
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @Михаил77, а в чём сложность? Условные операторы, циклы. Пробовал что-то?
     
  3. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0
    могу сделать в цикле только обычную таблицу без rowspan
    Если честно даже представить не могу как это сделать
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @Михаил77, напишите по-русски сначала, только по шагам. Самое главное - уметь описать алгоритм на человеческом языке.
     
  5. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0
    Имеется массив

    PHP:
    1. <?
    2. $array = array (
    3. "Один",
    4. "Два",
    5. "Три",
    6. "Четыре",
    7. "Пять",
    8. );
    9. ?>
    Использую цикл нужно получить таблицу (см. прикрепленный файл)
     

    Вложения:

    • table.png
      table.png
      Размер файла:
      11 КБ
      Просмотров:
      5
  6. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Не достаточно вот этого условия:
    PHP:
    1. ($number % $i) !== 0
    доведите до ума пожалста o_O:
    PHP:
    1. <?php
    2. function numberToRussian ($sourceNumber)
    3. {
    4.     $smallNumbers=array( //Числа 0..999
    5.      array('ноль'),
    6.      array('','один','два','три','четыре','пять','шесть','семь','восемь','девять'),
    7.      array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать',
    8.            'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'),
    9.      array('','','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто'),
    10.      array('','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'),
    11.      array('','одна','две')
    12.     );
    13.     $degrees=array(
    14.      array('дофигальон','','а','ов'), //обозначение для степеней больше, чем в списке
    15.      array('тысяч','а','и',''), //10^3
    16.      array('миллион','','а','ов'), //10^6
    17.      array('миллиард','','а','ов'), //10^9
    18.      array('триллион','','а','ов'), //10^12
    19.      array('квадриллион','','а','ов'), //10^15
    20.      array('квинтиллион','','а','ов'), //10^18
    21.      array('секстиллион','','а','ов'), //10^21
    22.      array('септиллион','','а','ов'), //10^24
    23.      array('октиллион','','а','ов'), //10^27
    24.      array('нониллион','','а','ов'), //10^30
    25.      array('дециллион','','а','ов') //10^33
    26.     );
    27.  
    28.     if ($sourceNumber==0) return $smallNumbers[0][0]; //Вернуть ноль
    29.     $sign = '';
    30.     if ($sourceNumber<0) {
    31.      $sign = 'минус '; //Запомнить знак, если минус
    32.      $sourceNumber = substr ($sourceNumber,1);
    33.     }
    34.     $result=array(); //Массив с результатом
    35.  
    36.     //Разложение строки на тройки цифр
    37.     $digitGroups = array_reverse(str_split(str_pad($sourceNumber,ceil(strlen($sourceNumber)/3)*3,'0',STR_PAD_LEFT),3));
    38.     foreach($digitGroups as $key=>$value){
    39.      $result[$key]=array();
    40.      //Преобразование трёхзначного числа прописью по-русски
    41.      foreach ($digit=str_split($value) as $key3=>$value3) {
    42.       if (!$value3) continue;
    43.       else {
    44.        switch ($key3) {
    45.         case 0:
    46.          $result[$key][] = $smallNumbers[4][$value3];
    47.          break;
    48.         case 1:
    49.          if ($value3==1) {
    50.           $result[$key][]=$smallNumbers[2][$digit[2]];
    51.           break 2;
    52.          }
    53.          else $result[$key][]=$smallNumbers[3][$value3];
    54.         break;
    55.         case 2:
    56.          if (($key==1)&&($value3<=2)) $result[$key][]=$smallNumbers[5][$value3];
    57.          else $result[$key][]=$smallNumbers[1][$value3];
    58.         break;
    59.        }
    60.       }
    61.      }
    62.      $value*=1;
    63.      if (!$degrees[$key]) $degrees[$key]=reset($degrees);
    64.    
    65.      //Учесть окончание слов для русского языка
    66.      if ($value && $key) {
    67.       $index = 3;
    68.       if (preg_match("/^[1]$|^\\d*[0,2-9][1]$/",$value)) $index = 1; //*1, но не *11
    69.       else if (preg_match("/^[2-4]$|\\d*[0,2-9][2-4]$/",$value)) $index = 2; //*2-*4, но не *12-*14
    70.       $result[$key][]=$degrees[$key][0].$degrees[$key][$index];
    71.      }
    72.      $result[$key]=implode(' ',$result[$key]);
    73.     }
    74.  
    75.     return $sign.implode(' ',array_reverse($result));
    76. }
    77.  
    78. $number = 10;
    79. $table = "<tr>";
    80.  
    81. for ($i = 1; $i <= $number; $i++)
    82. {
    83.     $str = numberToRussian($i);
    84.     $tr = (($number % $i) !== 0 ) ? "</tr><tr>" : '';
    85.     $table .= ($i == 1) ? "<td rowspan='{$number}'>{$str}</td>" : "<td>{$str}</td>{$tr}";
    86. }
    87.  
    88. $table .= "</tr>";
    89.  
    90. echo "<table border='1'>$table<table>";
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @Artur_hopf, а ты уверен, что чел, который пять значений не может циклом вывести, способен понять данный код?
     
    tohyich нравится это.
  8. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Да в том то и дело что я сам не справился. Хотелось универсальное решение если может быть разное количество цифр.
     
  9. Михаил77

    Михаил77 Активный пользователь

    С нами с:
    16 окт 2019
    Сообщения:
    31
    Симпатии:
    0

    Как раз то вывести могу а вот с конкретной задачей не могу справиться
    --- Добавлено ---
    Вывести обычную таблицу из массива не нужны особые знания

    <table>
    PHP:
    1.       <?
    2.         $k=0;
    3.         foreach($array as $element)
    4.         {
    5.             $k++;
    6.             if ($k % 3 == 1)
    7.             {
    8.                 echo "<tr>";
    9.             }
    10.  
    11.    echo "<td>".$element."</td>";
    12.  
    13.       if ($k % 3 == 0)
    14.             {
    15.                 echo "</tr>";
    16.             }
    17. ?>
    </table>


    А вот сделать так чтобы первая ячейка была со свойством rowspan и объединяла строки второго и третьего столбца задача не простая
     
  10. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Михаил77 ну вот же, тести
    ставь сюда нужное количество цифр $number = 10;
    PHP:
    1. <?php
    2. function numberToRussian ($sourceNumber)
    3. {
    4.     $smallNumbers=array( //Числа 0..999
    5.      array('ноль'),
    6.      array('','один','два','три','четыре','пять','шесть','семь','восемь','девять'),
    7.      array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать',
    8.            'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'),
    9.      array('','','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто'),
    10.      array('','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'),
    11.      array('','одна','две')
    12.     );
    13.     $degrees=array(
    14.      array('дофигальон','','а','ов'), //обозначение для степеней больше, чем в списке
    15.      array('тысяч','а','и',''), //10^3
    16.      array('миллион','','а','ов'), //10^6
    17.      array('миллиард','','а','ов'), //10^9
    18.      array('триллион','','а','ов'), //10^12
    19.      array('квадриллион','','а','ов'), //10^15
    20.      array('квинтиллион','','а','ов'), //10^18
    21.      array('секстиллион','','а','ов'), //10^21
    22.      array('септиллион','','а','ов'), //10^24
    23.      array('октиллион','','а','ов'), //10^27
    24.      array('нониллион','','а','ов'), //10^30
    25.      array('дециллион','','а','ов') //10^33
    26.     );
    27.     if ($sourceNumber==0) return $smallNumbers[0][0]; //Вернуть ноль
    28.     $sign = '';
    29.     if ($sourceNumber<0) {
    30.      $sign = 'минус '; //Запомнить знак, если минус
    31.      $sourceNumber = substr ($sourceNumber,1);
    32.     }
    33.     $result=array(); //Массив с результатом
    34.     //Разложение строки на тройки цифр
    35.     $digitGroups = array_reverse(str_split(str_pad($sourceNumber,ceil(strlen($sourceNumber)/3)*3,'0',STR_PAD_LEFT),3));
    36.     foreach($digitGroups as $key=>$value){
    37.      $result[$key]=array();
    38.      //Преобразование трёхзначного числа прописью по-русски
    39.      foreach ($digit=str_split($value) as $key3=>$value3) {
    40.       if (!$value3) continue;
    41.       else {
    42.        switch ($key3) {
    43.         case 0:
    44.          $result[$key][] = $smallNumbers[4][$value3];
    45.          break;
    46.         case 1:
    47.          if ($value3==1) {
    48.           $result[$key][]=$smallNumbers[2][$digit[2]];
    49.           break 2;
    50.          }
    51.          else $result[$key][]=$smallNumbers[3][$value3];
    52.         break;
    53.         case 2:
    54.          if (($key==1)&&($value3<=2)) $result[$key][]=$smallNumbers[5][$value3];
    55.          else $result[$key][]=$smallNumbers[1][$value3];
    56.         break;
    57.        }
    58.       }
    59.      }
    60.      $value*=1;
    61.      if (!$degrees[$key]) $degrees[$key]=reset($degrees);
    62.  
    63.      //Учесть окончание слов для русского языка
    64.      if ($value && $key) {
    65.       $index = 3;
    66.       if (preg_match("/^[1]$|^\\d*[0,2-9][1]$/",$value)) $index = 1; //*1, но не *11
    67.       else if (preg_match("/^[2-4]$|\\d*[0,2-9][2-4]$/",$value)) $index = 2; //*2-*4, но не *12-*14
    68.       $result[$key][]=$degrees[$key][0].$degrees[$key][$index];
    69.      }
    70.      $result[$key]=implode(' ',$result[$key]);
    71.     }
    72.     return $sign.implode(' ',array_reverse($result));
    73. }
    74. $number = 10;
    75. $table = "<tr>";
    76. for ($i = 1; $i <= $number; $i++)
    77. {
    78.     $str = numberToRussian($i);
    79.     $tr = (($i % 2) == 1 ) ? "</tr><tr>" : '';
    80.     $table .= ($i == 1) ? "<td rowspan='{$number}'>{$str}</td>" : "<td>{$str}</td>{$tr}";
    81. }
    82. $table .= "</tr>";
    83. echo "<table border='1'>$table<table>";