Jump to content
  • 0

Из массива в таблицу


RK3DNP
 Share

Question

Добрый день, помогите пожалуйста сформировать таблицу из массива. Нужно получить.:

Январь     1   4    9

Февраль   2   4    5

Сентябрь 5  10  25

В идеале, если на этот месяце нет даты, то этот месяц не отображается, но это не так важно, так как маловероятно такое.

Массив состоит из таких данных:

2014-01-01 00:00:00

2014-02-15 00:00:00

2014-02-10 00:00:00

....

Сложность в получении чтобы создавалась строки с названием месяца один раз и в ней были столбики с датами для этого месяца.

foreach($date as $value){$god = substr($value, 0, 4);$mes = substr($value, 5, 2);$den = substr($value, 8, 2);  	 if ($mes == '09' ){	 echo '<tr>';     echo '<td>'.'Сентябрь'.'</td>';	 echo'<td>'. $den.'</td>';	 echo '</tr>';		}

Я так подазриваю что надо так же делать через foreach (вместо if ($mes == '09' )), выборку по номеру месяца, но что-то не пойму как будет синтакс

Link to comment
Share on other sites

24 answers to this question

Recommended Posts

  • 0

http://www.kobzarev.com/programming/vivod-dati-iz-mysql-na-russkom-yazike.html

http://webi.ru/webi_articles/8_15_f.html

http://myrusakov.ru/forum.html?act=thread&id=1326

на выходе типа того:

SELECT DATE_FORMAT(date, '%e %m %Y, %H:%i') as date FROM #__table

это все если вы берете дату из mysql, а я так подозреваю что это так.

Link to comment
Share on other sites

  • 0

Да мне не нужно поменять формат даты, мне нужно из массива получить таблицу месяца, где каждая строка это название месяца (всего 12 строк) и каждый столбец это дата в этом месяце. В месяце может быть и 1 дата и 20 дат. Другими словами, я ща уперся в то, как сделать выборку по номеру месяца в foreach?

Наподобие:

post-1198-0-71162700-1407861530.png

Edited by RK3DNP
Link to comment
Share on other sites

  • 0

Не могу понять почему при таком коде данные выводятся даже если они меньше 10 хотя если смотреть $val1 то там присутствуют только данные 09, 10, 11

foreach($date as $value){$god = substr($value, 0, 4);$mes = substr($value, 5, 2);$den = substr($value, 8, 2); if ($maxgod == $god) { foreach ($date as $key => $val) {	 $val1 = substr($val, 5, 2);	// echo $val1.'</br>';	 if ($val1 > "10" ){	 echo '<tr>';     echo '<td>'.'Сентябрь'.'</td>';	 echo'<td>'. $den.'</td>';	 echo '</tr>';		} }}	} 
Link to comment
Share on other sites

  • 0

типа того что ль?

$date = array('2014-01-01 00:00:00', '2014-02-15 00:00:00', '2014-02-10 00:00:00');echo '<table>';foreach($date as $value) {	$value = rtrim($value, '00:00:00');	$value = explode('-', $value);	echo '		<tr>			<td>Сентябрь</td>			<td>'.$value[1].'</td>		</tr>';}echo '</table>';
Link to comment
Share on other sites

  • 0

Видимо не совмем, так как мне вот что выдало:

Сентябрь 01
Сентябрь 02
Сентябрь 02

 

Должно быть 12 строк, 1 строка это Январь, 2ая строка Февраль... Если в дате стоит 01 месяц, то число попадает в 1ую строчку, если 02, то в Февраль, если 03 то к Марту. В одном месяце может быть и 20 разных чисел.

Edited by RK3DNP
Link to comment
Share on other sites

  • 0

мозги уже не варят, но если чуток доработать то можно вот такой вариант:

$date = array('2014-01-01 00:00:00', '2014-02-15 00:00:00', '2014-02-10 00:00:00');$month = array(	'01' => 'Январь',	'02' => 'Февраль',	'03' => 'Март',	'04' => 'Апрель',	'05' => 'Май',	'06' => 'Июнь',	'07' => 'Июль',	'08' => 'Август',	'09' => 'Сентябрь',	'10' => 'Октябрь',	'11' => 'Ноябрь',	'12' => 'Декабрь',);echo '<table>';foreach($date as $value) {	$value = rtrim($value, '00:00:00');	$value = explode('-', $value);	$td .= '<td>'.$value[2].'</td>';}foreach($month as $key => $val) {	echo '		<tr>			<td>'.$val.'</td>'.$td.'		</tr>';}echo '</table>';
Link to comment
Share on other sites

  • 0

А если так, с заимствованием определенных моментов  у rus
 

$date = array('2014-01-01 00:00:00', '2014-02-15 00:00:00', '2014-02-10 00:00:00');$month = array(    '01' => 'Январь',    '02' => 'Февраль',    '03' => 'Март',    '04' => 'Апрель',    '05' => 'Май',    '06' => 'Июнь',    '07' => 'Июль',    '08' => 'Август',    '09' => 'Сентябрь',    '10' => 'Октябрь',    '11' => 'Ноябрь',    '12' => 'Декабрь',);$row = '';$day_ = 0;$month_ = 0;$year_ = 0;foreach($date as $value){    $value = explode(' ', $value);    $date_= explode('-', $value[0]);    $time_ = explode(':', $value[1]);//возможно пригодится, если время будет не 00:00:00        if($year_ == $date_[0]){        if($month_ == $date_[1]){            $day_ = $date_[2];            $row .= "<td><a>". $day_ ."</a></td>";//по аналогии с $year_ и $month_ можно сделать обработку для $day_, если будут собития в разное время в один день (можно сделать например, всплывающее меню при наведении курсора на номер дня, где будут перечисленны события с указанием времени, а время можно быдет взять из $time_)        }else{            $row .= "</tr>";            $month_ = $date_[1];            $row .= "<tr><td>". $month[$month_] ."</td>";        }    }else{        if(!$year_){            $row .= "</tr></table>";            echo $row;        }        $year_ = $date_[0];        $month_ = $date_[1];        $day_ = $date_[2];        $row = "<h2>".$year_."</h2><table><tr><td>". $month[$month_] ."</td><td><a>". $day_ ."</a></td>";    }}echo $row ."</tr></table>";

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

Link to comment
Share on other sites

  • 0

 

мозги уже не варят, но если чуток доработать то можно вот такой вариант:

$date = array('2014-01-01 00:00:00', '2014-02-15 00:00:00', '2014-02-10 00:00:00');$month = array(	'01' => 'Январь',	'02' => 'Февраль',	'03' => 'Март',	'04' => 'Апрель',	'05' => 'Май',	'06' => 'Июнь',	'07' => 'Июль',	'08' => 'Август',	'09' => 'Сентябрь',	'10' => 'Октябрь',	'11' => 'Ноябрь',	'12' => 'Декабрь',);echo '<table>';foreach($date as $value) {	$value = rtrim($value, '00:00:00');	$value = explode('-', $value);	$td .= '<td>'.$value[2].'</td>';}foreach($month as $key => $val) {	echo '		<tr>			<td>'.$val.'</td>'.$td.'		</tr>';}echo '</table>';

К сожалению тоже не подходит, вот что получилось:

Январь	01 	15 	10Февраль	01 	15 	10Март	01 	15 	10Апрель	01 	15 	10Май	01 	15 	10Июнь	01 	15 	10Июль	01 	15 	10Август	01 	15 	10Сентябрь	01 	15 	10Октябрь	01 	15 	10Ноябрь	01 	15 	10Декабрь	01 	15 	10 

А если так, с заимствованием определенных моментов  у rus

 

$date = array('2014-01-01 00:00:00', '2014-02-15 00:00:00', '2014-02-10 00:00:00');$month = array(    '01' => 'Январь',    '02' => 'Февраль',    '03' => 'Март',    '04' => 'Апрель',    '05' => 'Май',    '06' => 'Июнь',    '07' => 'Июль',    '08' => 'Август',    '09' => 'Сентябрь',    '10' => 'Октябрь',    '11' => 'Ноябрь',    '12' => 'Декабрь',);$row = '';$day_ = 0;$month_ = 0;$year_ = 0;foreach($date as $value){    $value = explode(' ', $value);    $date_= explode('-', $value[0]);    $time_ = explode(':', $value[1]);//возможно пригодится, если время будет не 00:00:00        if($year_ == $date_[0]){        if($month_ == $date_[1]){            $day_ = $date_[2];            $row .= "<td><a>". $day_ ."</a></td>";//по аналогии с $year_ и $month_ можно сделать обработку для $day_, если будут собития в разное время в один день (можно сделать например, всплывающее меню при наведении курсора на номер дня, где будут перечисленны события с указанием времени, а время можно быдет взять из $time_)        }else{            $row .= "</tr>";            $month_ = $date_[1];            $row .= "<tr><td>". $month[$month_] ."</td>";        }    }else{        if(!$year_){            $row .= "</tr></table>";            echo $row;        }        $year_ = $date_[0];        $month_ = $date_[1];        $day_ = $date_[2];        $row = "<h2>".$year_."</h2><table><tr><td>". $month[$month_] ."</td><td><a>". $day_ ."</a></td>";    }}echo $row ."</tr></table>";

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

 

К сожалению за февраль вывел только одно значение, а не два. А так да, так как надо

Январь 01

Февраль 10

Edited by RK3DNP
Link to comment
Share on other sites

  • 0

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

$date = array('2014-01-01 00:00:00', '2014-02-15 00:00:00', '2014-02-10 00:00:00');asort($date);$month = array(    '01' => 'Январь',    '02' => 'Февраль',    '03' => 'Март',    '04' => 'Апрель',    '05' => 'Май',    '06' => 'Июнь',    '07' => 'Июль',    '08' => 'Август',    '09' => 'Сентябрь',    '10' => 'Октябрь',    '11' => 'Ноябрь',    '12' => 'Декабрь',);$row = '';$day_ = 0;$month_ = 0;$year_ = 0;foreach($date as $value){    $value = explode(' ', $value);    $date_= explode('-', $value[0]);    $time_ = explode(':', $value[1]);//возможно пригодится, если время будет не 00:00:00        if($year_ == $date_[0]){        if($month_ == $date_[1]){            $day_ = $date_[2];            $row .= "<td><a>". $day_ ."</a></td>";//по аналогии с $year_ и $month_ можно сделать обработку для $day_, если будут собития в разное время в один день (можно сделать например, всплывающее меню при наведении курсора на номер дня, где будут перечисленны события с указанием времени, а время можно быдет взять из $time_)        }else{            $row .= "</tr>";            $month_ = $date_[1];            $day_ = $date_[2];            $row .= "<tr><td>". $month[$month_] ."</td><td>". $day_ ."</td>";        }    }else{        if(!$year_){            $row .= "</tr></table>";            echo $row;        }        $year_ = $date_[0];        $month_ = $date_[1];        $day_ = $date_[2];        $row = "<h2>".$year_."</h2><table><tr><td>". $month[$month_] ."</td><td><a>". $day_ ."</a></td>";    }}echo $row ."</tr></table>";
Edited by Switch74
Link to comment
Share on other sites

  • 0

А можно еще попросить, мне на самом деле надо будет 3 таблицы, это 3 года последних от максимума. Причем 1ая таблица это самый максимальный год, к примеру 2015, 2ая таблица 2014, 3я это 2013 год.

Данный код отображает только самый последний год, у меня получается 2015

Link to comment
Share on other sites

  • 0

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

<?php$date = array('2014-01-01 00:00:00', '2014-01-11 00:00:00', '2014-02-15 00:00:00', '2015-03-20 00:00:00');asort($date);$month = array(    '01' => 'Январь',    '02' => 'Февраль',    '03' => 'Март',    '04' => 'Апрель',    '05' => 'Май',    '06' => 'Июнь',    '07' => 'Июль',    '08' => 'Август',    '09' => 'Сентябрь',    '10' => 'Октябрь',    '11' => 'Ноябрь',    '12' => 'Декабрь',);$row = '';$day_ = 0;$month_ = 0;$year_ = 0;$maxyear = max($date);$maxyear = substr($maxyear, 0, 4);foreach($date as $value){    $value = explode(' ', $value);    $date_= explode('-', $value[0]);    $time_ = explode(':', $value[1]);//возможно пригодится, если время будет не 00:00:00        if($year_ == $date_[0]){        if($month_ == $date_[1]){            $day_ = $date_[2];            $row .= "<td><a>". $day_ ."</a></td>";//по аналогии с $year_ и $month_ можно сделать обработку для $day_, если будут собития в разное время в один день (можно сделать например, всплывающее меню при наведении курсора на номер дня, где будут перечисленны события с указанием времени, а время можно быдет взять из $time_)        }else{            $row .= "</tr>";            $month_ = $date_[1];            $day_ = $date_[2];            $row .= "<tr><td>". $month[$month_] ."</td><td>". $day_ ."</td>";        }    }else{        if(!$year_){            $row .= "</tr></table>";            echo $row;        }        $year_ = $date_[0];        $month_ = $date_[1];        $day_ = $date_[2];        if ($year_ == ($maxyear-1)) {        $row = "<h2>".$year_."</h2><table><tr><td>". $month[$month_] ."</td><td><a>". $day_ ."</a></td>";}        if ($year_ == $maxyear) {        $row1 = "<h2>".$year_."</h2><table><tr><td>". $month[$month_] ."</td><td><a>". $day_ ."</a></td>";}            }}echo $row1 ."</tr></table>";echo $row ."</tr></table>";?>
Link to comment
Share on other sites

  • 0

данный косяк исправлялся легче

$date = array('2014-01-01 00:00:00', '2014-01-11 00:00:00', '2014-02-15 00:00:00', '2015-03-20 00:00:00');asort($date);$month = array(    '01' => 'Январь',    '02' => 'Февраль',    '03' => 'Март',    '04' => 'Апрель',    '05' => 'Май',    '06' => 'Июнь',    '07' => 'Июль',    '08' => 'Август',    '09' => 'Сентябрь',    '10' => 'Октябрь',    '11' => 'Ноябрь',    '12' => 'Декабрь',);$row = '';$day_ = 0;$month_ = 0;$year_ = 0;foreach($date as $value){    $value = explode(' ', $value);    $date_= explode('-', $value[0]);    $time_ = explode(':', $value[1]);//возможно пригодится, если время будет не 00:00:00        if($year_ == $date_[0]){        if($month_ == $date_[1]){            $day_ = $date_[2];            $row .= "<td><a>". $day_ ."</a></td>";//по аналогии с $year_ и $month_ можно сделать обработку для $day_, если будут собития в разное время в один день (можно сделать например, всплывающее меню при наведении курсора на номер дня, где будут перечисленны события с указанием времени, а время можно быдет взять из $time_)        }else{            $row .= "</tr>";            $month_ = $date_[1];            $day_ = $date_[2];            $row .= "<tr><td>". $month[$month_] ."</td><td>". $day_ ."</td>";        }    }else{        if($year_){            $row .= "</tr></table>";            echo $row;        }        $year_ = $date_[0];        $month_ = $date_[1];        $day_ = $date_[2];        $row = "<h2>".$year_."</h2><table><tr><td>". $month[$month_] ."</td><td><a>". $day_ ."</a></td>";    }}echo $row ."</tr></table>";
Edited by Switch74
Link to comment
Share on other sites

  • 0

Ну да, действительно всего 1 символ ))

Теперь новая проблема (можно без кода, просто куда копать), сортировка идет на увеличение, в результате 1 столбец 2014 го, 2ой столбец 2015 год, а мне нужно сделать наоборот.

Если я делаю arsort($date); года меняются, но так же меняются и даты

Сентябрь 25   24   22   17   15   11   03

что не хорошо. Можно ли поменять только года местами? Так же у меня где дата,это ссылка на материал, она выводится у меня так: $html1[$i].$day_. где [$i] порядковый номер в массиве, это нужно тоже учитывать. Причем массив $html1 по умолчанию отсортирован на увеличение и не изменяет сортировку, поэтому либо брать кол-во элементов и вычитать по 1 значению, либо от нуля прибавлять.
Edited by RK3DNP
Link to comment
Share on other sites

  • 0

а тут будет немного сложнее, вам тогда придется сделать разбор даты на многомерный массив, который будет на вроде этого:
$data[2014][02][01]
и при разборе этого массива вы сможете упорядочить сначала по убыванию год, а потом по возрастанию месяц и день
так же можно попробовать сделать через float в верстке, но простое решение не всегда удобное на мой взгляд

Link to comment
Share on other sites

  • 0

А ну в принципе да, можно же через css попробовать поменять таблицы местами

С максимальным годом сделал по левому краю, с меньшем годом, по правому краю.

Правда теперь если один год всего, то он будет к правому краю, пока не знаю как решить эту проблему. Но скоро уже 2015 год и будет все нормально ))

Edited by RK3DNP
Link to comment
Share on other sites

  • 0

Ну и эту проблему решил ))) Появилась новая )) В подобной таблице, надо выделить class first и last, но выдает только last. Если смотреть отладчик, то до последнего значения, $class= ' first', когда получается последнее значение, он становится как last.

<li class="">03</li>
<li class="">11</li>
<li class="">15</li>
<li class="">17</li>
<li class="">22</li>
<li class="">24</li>
<li class=" last">25</li>
$maxdate = max($date2);$maxyear = substr($maxdate, 0, 4);$maxmonth = substr($maxdate, 5, 2);$last_child = count($date2)-1 ;$f=0;foreach($date2 as $value2){	$value2 = explode(' ', $value2);    $date2= explode('-', $value2[0]);	$time2 = explode(':', $value2[1]);		if($maxyear == $date2[0] and $maxmonth == $date2[1] ){		if ($f == 0) {$class= ' first';} 		if($f == $last_child){$class= ' last';}		$row2 .= '<li class="'.$class.'">'.$date2[2].'</li>';					}   $f++;}echo $row2;
Edited by RK3DNP
Link to comment
Share on other sites

  • 0

Можно сказать, что задачу свою решил, всем кто помог огромное спасибо. Если кому интересно конечный результат, то вот http://skin.seoarmor.ru/raspisanie (нажав на выездные мероприятия, откроются другие даты)

сайт пока еще готов не полностью, так что строго не судите )))

Edited by RK3DNP
Link to comment
Share on other sites

  • 0

подозреваю, что у вас там где-то ссылка не закрыта, первые две статьи http://skin.seoarmor.ru/vyezdnye-seminary отображаются полностью как ссылка, возможно так оно и нужно конечно...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy