Добрый вечер! Подскажите пожалуйста как можно реализовать формирование таблицы из массива в цикле где первая ячейка будет объединять две строки? Заранее благодарю! Массив PHP: <? $array = array ( "Один", "Два", "Три", "Четыре", "Пять", ); ?> На выходе нужно получить такую таблицу HTML: <table> <tr> <td rowspan="2"> Один </td> <td> Два </td> <td> Три </td> </tr> <tr> <td> Четыре </td> <td> Пять </td> </tr> </table>
могу сделать в цикле только обычную таблицу без rowspan Если честно даже представить не могу как это сделать
@Михаил77, напишите по-русски сначала, только по шагам. Самое главное - уметь описать алгоритм на человеческом языке.
Имеется массив PHP: <? $array = array ( "Один", "Два", "Три", "Четыре", "Пять", ); ?> Использую цикл нужно получить таблицу (см. прикрепленный файл)
Не достаточно вот этого условия: PHP: ($number % $i) !== 0 доведите до ума пожалста : PHP: <?php function numberToRussian ($sourceNumber) { $smallNumbers=array( //Числа 0..999 array('ноль'), array('','один','два','три','четыре','пять','шесть','семь','восемь','девять'), array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать', 'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'), array('','','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто'), array('','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'), array('','одна','две') ); $degrees=array( array('дофигальон','','а','ов'), //обозначение для степеней больше, чем в списке array('тысяч','а','и',''), //10^3 array('миллион','','а','ов'), //10^6 array('миллиард','','а','ов'), //10^9 array('триллион','','а','ов'), //10^12 array('квадриллион','','а','ов'), //10^15 array('квинтиллион','','а','ов'), //10^18 array('секстиллион','','а','ов'), //10^21 array('септиллион','','а','ов'), //10^24 array('октиллион','','а','ов'), //10^27 array('нониллион','','а','ов'), //10^30 array('дециллион','','а','ов') //10^33 ); if ($sourceNumber==0) return $smallNumbers[0][0]; //Вернуть ноль $sign = ''; if ($sourceNumber<0) { $sign = 'минус '; //Запомнить знак, если минус $sourceNumber = substr ($sourceNumber,1); } $result=array(); //Массив с результатом //Разложение строки на тройки цифр $digitGroups = array_reverse(str_split(str_pad($sourceNumber,ceil(strlen($sourceNumber)/3)*3,'0',STR_PAD_LEFT),3)); foreach($digitGroups as $key=>$value){ $result[$key]=array(); //Преобразование трёхзначного числа прописью по-русски foreach ($digit=str_split($value) as $key3=>$value3) { if (!$value3) continue; else { switch ($key3) { case 0: $result[$key][] = $smallNumbers[4][$value3]; break; case 1: if ($value3==1) { $result[$key][]=$smallNumbers[2][$digit[2]]; break 2; } else $result[$key][]=$smallNumbers[3][$value3]; break; case 2: if (($key==1)&&($value3<=2)) $result[$key][]=$smallNumbers[5][$value3]; else $result[$key][]=$smallNumbers[1][$value3]; break; } } } $value*=1; if (!$degrees[$key]) $degrees[$key]=reset($degrees); //Учесть окончание слов для русского языка if ($value && $key) { $index = 3; if (preg_match("/^[1]$|^\\d*[0,2-9][1]$/",$value)) $index = 1; //*1, но не *11 else if (preg_match("/^[2-4]$|\\d*[0,2-9][2-4]$/",$value)) $index = 2; //*2-*4, но не *12-*14 $result[$key][]=$degrees[$key][0].$degrees[$key][$index]; } $result[$key]=implode(' ',$result[$key]); } return $sign.implode(' ',array_reverse($result)); } $number = 10; $table = "<tr>"; for ($i = 1; $i <= $number; $i++) { $str = numberToRussian($i); $tr = (($number % $i) !== 0 ) ? "</tr><tr>" : ''; $table .= ($i == 1) ? "<td rowspan='{$number}'>{$str}</td>" : "<td>{$str}</td>{$tr}"; } $table .= "</tr>"; echo "<table border='1'>$table<table>";
@Artur_hopf, а ты уверен, что чел, который пять значений не может циклом вывести, способен понять данный код?
Да в том то и дело что я сам не справился. Хотелось универсальное решение если может быть разное количество цифр.
Как раз то вывести могу а вот с конкретной задачей не могу справиться --- Добавлено --- Вывести обычную таблицу из массива не нужны особые знания <table> PHP: <? $k=0; foreach($array as $element) { $k++; if ($k % 3 == 1) { echo "<tr>"; } echo "<td>".$element."</td>"; if ($k % 3 == 0) { echo "</tr>"; } ?> </table> А вот сделать так чтобы первая ячейка была со свойством rowspan и объединяла строки второго и третьего столбца задача не простая
@Михаил77 ну вот же, тести ставь сюда нужное количество цифр $number = 10; PHP: <?php function numberToRussian ($sourceNumber) { $smallNumbers=array( //Числа 0..999 array('ноль'), array('','один','два','три','четыре','пять','шесть','семь','восемь','девять'), array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать', 'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать'), array('','','двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят','девяносто'), array('','сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот','восемьсот','девятьсот'), array('','одна','две') ); $degrees=array( array('дофигальон','','а','ов'), //обозначение для степеней больше, чем в списке array('тысяч','а','и',''), //10^3 array('миллион','','а','ов'), //10^6 array('миллиард','','а','ов'), //10^9 array('триллион','','а','ов'), //10^12 array('квадриллион','','а','ов'), //10^15 array('квинтиллион','','а','ов'), //10^18 array('секстиллион','','а','ов'), //10^21 array('септиллион','','а','ов'), //10^24 array('октиллион','','а','ов'), //10^27 array('нониллион','','а','ов'), //10^30 array('дециллион','','а','ов') //10^33 ); if ($sourceNumber==0) return $smallNumbers[0][0]; //Вернуть ноль $sign = ''; if ($sourceNumber<0) { $sign = 'минус '; //Запомнить знак, если минус $sourceNumber = substr ($sourceNumber,1); } $result=array(); //Массив с результатом //Разложение строки на тройки цифр $digitGroups = array_reverse(str_split(str_pad($sourceNumber,ceil(strlen($sourceNumber)/3)*3,'0',STR_PAD_LEFT),3)); foreach($digitGroups as $key=>$value){ $result[$key]=array(); //Преобразование трёхзначного числа прописью по-русски foreach ($digit=str_split($value) as $key3=>$value3) { if (!$value3) continue; else { switch ($key3) { case 0: $result[$key][] = $smallNumbers[4][$value3]; break; case 1: if ($value3==1) { $result[$key][]=$smallNumbers[2][$digit[2]]; break 2; } else $result[$key][]=$smallNumbers[3][$value3]; break; case 2: if (($key==1)&&($value3<=2)) $result[$key][]=$smallNumbers[5][$value3]; else $result[$key][]=$smallNumbers[1][$value3]; break; } } } $value*=1; if (!$degrees[$key]) $degrees[$key]=reset($degrees); //Учесть окончание слов для русского языка if ($value && $key) { $index = 3; if (preg_match("/^[1]$|^\\d*[0,2-9][1]$/",$value)) $index = 1; //*1, но не *11 else if (preg_match("/^[2-4]$|\\d*[0,2-9][2-4]$/",$value)) $index = 2; //*2-*4, но не *12-*14 $result[$key][]=$degrees[$key][0].$degrees[$key][$index]; } $result[$key]=implode(' ',$result[$key]); } return $sign.implode(' ',array_reverse($result)); } $number = 10; $table = "<tr>"; for ($i = 1; $i <= $number; $i++) { $str = numberToRussian($i); $tr = (($i % 2) == 1 ) ? "</tr><tr>" : ''; $table .= ($i == 1) ? "<td rowspan='{$number}'>{$str}</td>" : "<td>{$str}</td>{$tr}"; } $table .= "</tr>"; echo "<table border='1'>$table<table>";