ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Подсчет в textarea (https://forum.antichat.xyz/showthread.php?t=1398800)

Morse 19.08.2021 17:47

Как из этого текста в textarea посчитать часы

https://forum.antichat.xyz/attachments/27824006/

Hatrig 22.08.2021 09:35

Привет.

В своём ответе я покажу реализацию твоей задачи на PHP, и постараюсь объяснить подробнее каждый шаг.

Для теста я сделал простую форму с textarea, которая отдает данные на PHP через POST:

Форма с textarea:





Код:


Blasthack - answer by USEC

Go



В мире программистов существует парадигма разработки алгоритмов, которая именуется как "разделяй и властвуй". Принцип прост, мы делим задачу на мелкие и легко решаемые задачи, чтобы в конечном счете решить общую задачу.

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

2. Преобразуем полученные данные (массив из пункта 1) под формат даты.

3. Соберем часы, минуты и секунды в три массива hours, min, sec.

4. Найдем сумму часов, минут и секунд.

5. Произведем конечные расчеты времени, если минут или секунд более 60, то переведем их в часы и минуты соответственно.

Ниже я разместил код на PHP с комментариями.

Код на PHP, который считает время из формы:





Код:

if
(
isset
(
$_POST
[
'dates'
]
)
)
{
// Преобразуем полученные данные с формы в массив
$data_array
=
explode
(
')'
,
$_POST
[
'dates'
]
)
;
// Преобразуем полученный массив в многомерный массив под формат даты
$i
=
0
;
foreach
(
$data_array
as
$da
)
{
$data_format_array
[
$i
]
=
date_parse_from_format
(
"Y-m-d (H:i:s"
,
$da
)
;
$i
++
;
}
// Теперь соберем часы, минуты и секунды в массивы
$i
=
0
;
foreach
(
$data_format_array
as
$dfa
)
{
$hours
[
$i
]
=
$dfa
[
'hour'
]
;
$min
[
$i
]
=
$dfa
[
'minute'
]
;
$sec
[
$i
]
=
$dfa
[
'second'
]
;
$i
++
;
}
// Находим сумму часов, минут и секунд
$sum_hours
=
array_sum
(
$hours
)
;
$sum_min
=
array_sum
(
$min
)
;
$sum_sec
=
array_sum
(
$sec
)
;
// Если минут или секунд больше 60, то переводим их в часы или минуты
if
(
$sum_min
>=
60
)
{
$sum_hours
+
=
intval
(
$sum_min
/
60
)
;
$sum_min
=
$sum_min
%
60
;
}
if
(
$sum_sec
>=
60
)
{
$sum_min
+
=
intval
(
$sum_sec
/
60
)
;
$sum_sec
=
$sum_sec
%
60
;
}
// Выведем на экран полученные значения
echo
$sum_hours
.
' часов, '
.
$sum_min
.
' минут, '
.
$sum_sec
.
' секунд.'
;
}



Для демонстрации работы кода я использовал те значения, которые указаны в твоем вопросе. Вот результат:

https://forum.antichat.xyz/attachments/27825931/

xorl 26.09.2021 01:44

Цитата:

Сообщение от Hatrig

Привет.

В своём ответе я покажу реализацию твоей задачи на PHP, и постараюсь объяснить подробнее каждый шаг.
Для теста я сделал простую форму с textarea, которая отдает данные на PHP через POST:

Форма с textarea:





Код:


Blasthack - answer by USEC

Go



В мире программистов существует парадигма разработки алгоритмов, которая именуется как "разделяй и властвуй". Принцип прост, мы делим задачу на мелкие и легко решаемые задачи, чтобы в конечном счете решить общую задачу.

1. Полученные даты с формы мы преобразуем в массив, где каждая ячейка массива будет соответствовать одной дате.
2. Преобразуем полученные данные (массив из пункта 1) под формат даты.
3. Соберем часы, минуты и секунды в три массива hours, min, sec.
4. Найдем сумму часов, минут и секунд.
5. Произведем конечные расчеты времени, если минут или секунд более 60, то переведем их в часы и минуты соответственно.

Ниже я разместил код на PHP с комментариями.

Код на PHP, который считает время из формы:





Код:

if
(
isset
(
$_POST
[
'dates'
]
)
)
{
// Преобразуем полученные данные с формы в массив
$data_array
=
explode
(
')'
,
$_POST
[
'dates'
]
)
;
// Преобразуем полученный массив в многомерный массив под формат даты
$i
=
0
;
foreach
(
$data_array
as
$da
)
{
$data_format_array
[
$i
]
=
date_parse_from_format
(
"Y-m-d (H:i:s"
,
$da
)
;
$i
++
;
}
// Теперь соберем часы, минуты и секунды в массивы
$i
=
0
;
foreach
(
$data_format_array
as
$dfa
)
{
$hours
[
$i
]
=
$dfa
[
'hour'
]
;
$min
[
$i
]
=
$dfa
[
'minute'
]
;
$sec
[
$i
]
=
$dfa
[
'second'
]
;
$i
++
;
}
// Находим сумму часов, минут и секунд
$sum_hours
=
array_sum
(
$hours
)
;
$sum_min
=
array_sum
(
$min
)
;
$sum_sec
=
array_sum
(
$sec
)
;
// Если минут или секунд больше 60, то переводим их в часы или минуты
if
(
$sum_min
>=
60
)
{
$sum_hours
+
=
intval
(
$sum_min
/
60
)
;
$sum_min
=
$sum_min
%
60
;
}
if
(
$sum_sec
>=
60
)
{
$sum_min
+
=
intval
(
$sum_sec
/
60
)
;
$sum_sec
=
$sum_sec
%
60
;
}
// Выведем на экран полученные значения
echo
$sum_hours
.
' часов, '
.
$sum_min
.
' минут, '
.
$sum_sec
.
' секунд.'
;
}



Для демонстрации работы кода я использовал те значения, которые указаны в твоем вопросе. Вот результат:

пезда

PHP:





Код:

$stack
=
'2021-08-19 (04:16:12)
2021-08-18 (02:57:07)'
;
$seconds
=
0
;
preg_replace_callback
(
'#\((\d{2}):(\d{2}):(\d{2})\)#'
,
function
(
$matches
)
{
$GLOBALS
[
'seconds'
]
+
=
mktime
(
$matches
[
1
]
,
$matches
[
2
]
,
$matches
[
3
]
)
;
}
,
$stack
)
;
echo
date
(
'g'
,
$seconds
)
;


Hatrig 26.09.2021 21:56

Цитата:

Сообщение от xorl

пезда

PHP:





Код:

$stack
=
'2021-08-19 (04:16:12)
2021-08-18 (02:57:07)'
;
$seconds
=
0
;
preg_replace_callback
(
'#\((\d{2}):(\d{2}):(\d{2})\)#'
,
function
(
$matches
)
{
$GLOBALS
[
'seconds'
]
+
=
mktime
(
$matches
[
1
]
,
$matches
[
2
]
,
$matches
[
3
]
)
;
}
,
$stack
)
;
echo
date
(
'g'
,
$seconds
)
;



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

xorl 27.09.2021 20:12

да ради бога

PHP:





Код:

echo
date
(
'g часов i минут s секунд'
,
$seconds
)
;



Время: 16:25