Разбить строку на ассоциативный массив по нескольким ключевым словам из списка

Задача, это получить из строки "1 день 2 часа 15 минут 10 секунд" количество секунд для установки таймера. Причем в строке может быть любая комбинация составляющих. В идеале я вижу решение в получении регулярным выражением массива из 4 элементов независимо от содержания строки. Далее каждый элемент массива будет умножен на количество секунд в сутках, часах и минутах. Сейчас у меня не получается массив с фиксированным положением элементов, но по именам ключей я всё же могу посчитать секунды. Прошу предложить более изящное решение.

$t='2 часа 15 минут';
$parts = preg_split("/(?<=\s|^)(день|дня|дней|час|часа|часов|минут|минута|минуту|минуты|секунд|секунда|секунду|секунды)(?=\s|$)/", $t,-1, PREG_SPLIT_DELIM_CAPTURE);

$s=0;
for ($i = 0; $i <= count($parts)-2; $i+=2) {
     if (stripos($parts[$i+1], 'д') === 0) { $s+=trim($parts[$i])*86400; }
 elseif (stripos($parts[$i+1], 'ч') === 0) { $s+=trim($parts[$i])*3600; } 
 elseif (stripos($parts[$i+1], 'м') === 0) { $s+=trim($parts[$i])*60; } 
 elseif (stripos($parts[$i+1], 'с') === 0) { $s+=trim($parts[$i]); } 
}

echo $s;

Добавляю: уже были даны очень хорошие советы по условию задачи. Но конкретно в моем случае цифры могут быть прописью.


Ответы (1 шт):

Автор решения: splash58

Можно все варинты дней поменять на day, часы, часов... на hour и тд. И воспользоваться strtotime. Кстати, можно писать даже недели и года :)

echo date('c') ."\n";                                      // 2022-09-03T15:33:15+00:00
echo date('c', strtotime('+1 day 2 hour 15 min 10 sec'));  // 2022-09-04T17:48:25+00:00

соответственно, кол-во секунд

strtotime('+1 day 2 hour 15 min 10 sec') - time()
→ Ссылка