PHP разделяет строку на последнем номере, вставляет дополнительную строку и объединяет новую строку

Я построил вычисляющий скрипт, который занимает секунды и показывает их в y: d: h: m: s, содержащий метки и т. Д.

например. 15768012 = 1 year 12 seconds и 27362 = 15 hours 6 minutes 2 seconds .

Скрипт работает отлично, но я хотел бы посмотреть в строке и разделить ее на последнее число (не первое), а затем вставить слово and так:

15768012 = 1 year AND 12 seconds и 27362 = 15 hours 6 minutes AND 2 seconds .

Я могу написать свой сценарий, если вам это нужно, но я не думаю, что это поможет вам решить этот вопрос.

скажем, что $string = '15 hours 6 minutes 2 seconds' как бы вы разделили его и импортировали текст?

 <? if (isset($_POST['number'])) { $x = $_POST['number']; } else { $x = 54098; } // Labels $lb_y = 'year'; $lb_ys = 'years'; $lb_d = 'day'; $lb_ds = 'days'; $lb_h = 'hour'; $lb_hs = 'hours'; $lb_m = 'minute'; $lb_ms = 'minutes'; $lb_s = 'second'; $lb_ss = 'seconds'; $lb_and = 'and'; //$x = 54098; // Time in seconds - change to $row['time']; $f = 15768000; // seconds in a year $d = 43200; // seconds in a day $t = 3600; // seconds in an hour $m = 60; // senconds in a minute // Let's check if it is more than a minute if ($x >= $m) { // More than a minute // Let's check if it is more than an hour if ($x >= $t) { // More than an hour // Let's check if it is more than a day if($x >= $d) { // More than a day // Let's check if it is more than a year if ($x >= $f) { // More than a year // Calculate years $a = $x / $f; // Get everything before the separator '.' if (false !== ($cal = strpos($a, '.'))) { $a = substr($a, 0, $cal); } // $k = what's left $k = $x - ($f * $a); // Calculate days $b = $k / $d; // Get everything before the separator '.' if (false !== ($cal = strpos($b, '.'))) { $b = substr($b, 0, $cal); } // $y = what's left $y = $k - ($d * $b); // Calculate hours $c = $y / $t; // Get everything before the separator '.' if (false !== ($cal = strpos($c, '.'))) { $c = substr($c, 0, $cal); } // $z = what's left $z = $y - ($t * $c); // Calculate minutes $e = $z / $m; // Get everything before the separator '.' if (false !== ($cal = strpos($e, '.'))) { $e = substr($e, 0, $cal); } // $q = what's left $q = $z - ($m * $e); // Rewrite numbers if below 9 if ($a <= 9) { $xa = '0'.$a; } else { $xa = $a; } if ($b <= 9) { $xb = '0'.$b; } else { $xb = $b; } if ($c <= 9) { $xc = '0'.$c; } else { $xc = $c; } if ($e <= 9) { $xe = '0'.$e; } else { $xe = $e; } if ($q <= 9) { $xq = '0'.$q; } else { $xq = $q; } // Rewrite labels if ($a <= 1) { $lb_ys = $lb_y; } if ($b <= 1) { $lb_ds = $lb_d; } if ($c <= 1) { $lb_hs = $lb_h; } if ($e <= 1) { $lb_ms = $lb_m; } if ($q <= 1) { $lb_ss = $lb_s; } // if == 0 - do not show $a = $a.' '.$lb_ys.' '; if ($b == 0) {$b = '';} else {$b = $b.' '.$lb_ds.' ';} if ($c == 0) {$c = '';} else {$c = $c.' '.$lb_hs.' ';} if ($e == 0) {$e = '';} else {$e = $e.' '.$lb_ms.' ';} if ($q == 0) {$q = '';} else {$q = $q.' '.$lb_ss;} echo $xa.':'.$xb.':'.$xc.':'.$xe.':'.$xq; echo '<br>'.$a.$b.$c.$e.$q; } else { // Less than a year - but more than one day // Calculate days $b = $x / $d; // Get everything before the separator '.' if (false !== ($cal = strpos($b, '.'))) { $b = substr($b, 0, $cal); } // $y = what's left $y = $x - ($d * $b); // Calculate hours $c = $y / $t; // Get everything before the separator '.' if (false !== ($cal = strpos($c, '.'))) { $c = substr($c, 0, $cal); } // $z = what's left $z = $y - ($t * $c); // Calculate minutes $e = $z / $m; // Get everything before the separator '.' if (false !== ($cal = strpos($e, '.'))) { $e = substr($e, 0, $cal); } // $q = what's left $q = $z - ($m * $e); // Rewrite numbers if below 9 if ($b <= 9) { $xb = '0'.$b; } else { $xb = $b; } if ($c <= 9) { $xc = '0'.$c; } else { $xc = $c; } if ($e <= 9) { $xe = '0'.$e; } else { $xe = $e; } if ($q <= 9) { $xq = '0'.$q; } else { $xq = $q; } // Rewrite labels if ($b <= 1) { $lb_ds = $lb_d; } if ($c <= 1) { $lb_hs = $lb_h; } if ($e <= 1) { $lb_ms = $lb_m; } if ($q <= 1) { $lb_ss = $lb_s; } // if == 0 - do not show $b = $b.' '.$lb_ds.' '; if ($c == 0) {$c = '';} else {$c = $c.' '.$lb_hs.' ';} if ($e == 0) {$e = '';} else {$e = $e.' '.$lb_ms.' ';} if ($q == 0) {$q = '';} else {$q = $q.' '.$lb_ss;} echo $xb.':'.$xc.':'.$xe.':'.$xq; echo '<br>'.$b.$c.$e.$q; } } else { // Less than a day // Calculate hours $c = $x / $t; // Get everything before the separator '.' if (false !== ($cal = strpos($c, '.'))) { $c = substr($c, 0, $cal); } // $z = what's left $z = $x - ($t * $c); // Calculate minutes $e = $z / $m; // Get everything before the separator '.' if (false !== ($cal = strpos($e, '.'))) { $e = substr($e, 0, $cal); } // $q = what's left $q = $z - ($m * $e); // Rewrite numbers if below 9 if ($c <= 9) { $xc = '0'.$c; } else { $xc = $c; } if ($e <= 9) { $xe = '0'.$e; } else { $xe = $e; } if ($q <= 9) { $xq = '0'.$q; } else { $xq = $q; } // Rewrite labels if ($c <= 1) { $lb_hs = $lb_h; } if ($e <= 1) { $lb_ms = $lb_m; } if ($q <= 1) { $lb_ss = $lb_s; } // if == 0 - do not show $c = $c.' '.$lb_hs.' '; if ($e == 0) {$e = '';} else {$e = $e.' '.$lb_ms.' ';} if ($q == 0) {$q = '';} else {$q = $q.' '.$lb_ss;} echo $xc.':'.$xe.':'.$xq; echo '<br>'.$c.$e.$q; } } else { // Less than an hour // Calculate minutes $e = $x / $m; // Get everything before the separator '.' if (false !== ($cal = strpos($e, '.'))) { $e = substr($e, 0, $cal); } // $q = what's left $q = $x - ($m * $e); // Rewrite numbers if below 9 if ($e <= 9) { $xe = '0'.$e; } else { $xe = $e; } if ($q <= 9) { $xq = '0'.$q; } else { $xq = $q; } // Rewrite labels if ($e <= 1) { $lb_ms = $lb_m; } if ($q <= 1) { $lb_ss = $lb_s; } // if == 0 - do not show $e = $e.' '.$lb_ms.' '; if ($q == 0) {$q = '';} else {$q = $q.' '.$lb_ss;} echo $xe.':'.$xq; echo '<br>'.$e.$q; } } else { // Less than a minute // Only secounds // Rewrite numbers if below 9 if ($x <= 9) { $xx = '0'.$x; } else { $xx = $x; } // Rewrite labels if ($x <= 1) { $lb_ss = $lb_s; } // if == 0 - do not show $x = $x.' '.$lb_ss; echo '00:'.$xx; echo '<br>'.$x; } ?> <form action="" method="post"><input name="number" type="text"><input name="" type="submit" value="Submit"></form> 

Спасибо всем за вашу помощь. Вот упрощенный и сделанный сценарий. У меня есть новая проблема, хотя .. когда вы вводите менее 1576 в поле, она пишет несколько разных чисел, чем я хочу …

EDIT: проблема теперь исправлена. Добро пожаловать на использование скрипта: D

 <? if (isset($_POST['number'])) { $x = $_POST['number']; } else { $x = 54098; } // Labels $lb_y = 'year'; $lb_ys = 'years'; $lb_d = 'day'; $lb_ds = 'days'; $lb_h = 'hour'; $lb_hs = 'hours'; $lb_m = 'minute'; $lb_ms = 'minutes'; $lb_s = 'second'; $lb_ss = 'seconds'; $lb_and = 'and'; //$x = 54098; // Time in seconds - change to $row['time']; $f = 15768000; // seconds in a year $d = 43200; // seconds in a day $h = 3600; // seconds in an hour $m = 60; // seconds in a minute $a = $x / $f; if (false !== ($cal = strpos($a, 'E-'))) { $a = 0; } if (false !== ($cal = strpos($a, '.'))) { $a = substr($a, 0, $cal); } if ($a <= 0) { $a = 0; } $b = ($x - ($f * $a)) / $d; if (false !== ($cal = strpos($b, 'E-'))) { $b = 0; } if (false !== ($cal = strpos($b, '.'))) { $b = substr($b, 0, $cal); } if ($b <= 0) { $b = 0; } $c = ($x - ($f * $a) - ($d * $b)) / $h; if (false !== ($cal = strpos($c, 'E-'))) { $c = 0; } if (false !== ($cal = strpos($c, '.'))) { $c = substr($c, 0, $cal); } if ($c <= 0) { $c = 0; } $e = ($x - ($f * $a) - ($d * $b) - ($h * $c)) / $m; if (false !== ($cal = strpos($e, '.'))) { $e = substr($e, 0, $cal); } if ($e <= 0) { $e = 0; } $q = ($x - ($f * $a) - ($d * $b) - ($h * $c) - ($m * $e)); // Rewrite numbers if below 9 if ($a <= 9) { $xa = '0'.$a; } else { $xa = $a; } if ($b <= 9) { $xb = '0'.$b; } else { $xb = $b; } if ($c <= 9) { $xc = '0'.$c; } else { $xc = $c; } if ($e <= 9) { $xe = '0'.$e; } else { $xe = $e; } if ($q <= 9) { $xq = '0'.$q; } else { $xq = $q; } // Rewrite labels if ($a <= 1) { $lb_ys = $lb_y; } if ($b <= 1) { $lb_ds = $lb_d; } if ($c <= 1) { $lb_hs = $lb_h; } if ($e <= 1) { $lb_ms = $lb_m; } if ($q <= 1) { $lb_ss = $lb_s; } // if == 0 - do not show if ($a == 0) {$a = '';} else {$a = $a.' '.$lb_ys;} if ($b == 0) {$b = '';} else {$b = $b.' '.$lb_ds;} if ($c == 0) {$c = '';} else {$c = $c.' '.$lb_hs;} if ($e == 0) {$e = '';} else {$e = $e.' '.$lb_ms;} if ($q == 0) {$q = '';} else {$q = $q.' '.$lb_ss;} echo $xa.':'.$xb.':'.$xc.':'.$xe.':'.$xq.'<br>'; $time = array($a, $b, $c, $e, $q); $time = array_filter($time); $count = count($time); $last = array_pop($time); if ($count == 1) { $string = $last; } elseif ($count == 0) { $string = '<i>No Time described</i>'; } else { $string = implode(', ', $time) . ' '.$lb_and.' ' . $last; } echo '<br>'.$string; ?> <br><br> <form action="" method="post"><input name="number" type="text"><input name="" type="submit" value="Submit"></form> 

    Быстрое исправление может быть:

     $string = '15 hours 6 minutes 2 seconds'; $pattern ='/ \d+ \w+$/'; $string = preg_replace($pattern, ' and$0', $string); 

    Тем не менее, вы можете захотеть взглянуть на более приятное решение, которое привело к построению следующего массива:

     $time = array($a, $b, $c, $e, $q); 

    Тогда вы можете:

     $time = array_filter($time); $last = array_pop($time); $string = implode(', ', $time) . ' and ' . $last; 

    Это выглядит довольно долго и утомительно, когда вы можете использовать подразделение, чтобы помочь понять ценности, как вы идете. Таким образом, вы можете делать логику по ним по одному (чтобы выяснить, нужны ли они в конце или нет.

     $x / $f = $years ($x - ($f * $years)) / $d = $days ($x - ($f * $years) - ($d * $days)) / $h = $hours ($x - ($f * $years) - ($d * $days) - ($h * $hours)) / $m = $minutes ($x - ($f * $years) - ($d * $days) - ($h * $hours) - ($m * $minutes)) = $seconds 

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

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

    Поскольку то, что вы уже достигли, относительно сложно, я полагаю, вам нужны только некоторые намеки; так:

    • функция разрыва : http://php.net/manual/en/function.explode.php
    • как вы знаете, ваша строка заканчивается номером и его единицами, игнорируйте последние 2 элемента массива, созданных explode
    • loop (каким бы способом вы ни считали нужным, не обязательно традиционным for цикла) через массив и добавляли «и» в.

    Было бы более эффективно, если вы создадите его непосредственно в своей функции, но тем временем вы можете использовать preg_replace.

    http://nl3.php.net/manual/en/function.preg-replace.php

     $string = '15 hours 6 minutes 2 seconds' $pattern ='/(\d+)\sseconds/'; $string =preg_replace($pattern,' And $1 seconds',$string);