Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день, коллеги!
Помогите пожалуйста найти готовые решения или библиотеки, которые бы позволяли сделать пару вещей.
Первое: перечисление типа 5,6,7,10,15,16,17,21,29 преобразовать в 5-7,10,15-17,21,29
Второе: перечисление типа 5-7,10,15-17,21,29 преобразовать в 5,6,7,10,15,16,17,21,29
Обе функции я написал, конечно, но думаю, что достаточно коряво Хотелось бы посмотреть на опыт профессионалов, но что-то найти не могу. Наверное вопрос неправильно формулирую.
Не в сети
Не в сети
Не в сети
Да нет же, дело чисто по работе
Просто реально говорю, что функции корявенькие.
Вот первая, например: (Но она проще, как мне показалось... )
Могу скинуть вторую - но она вообще монстр! Поэтому и ищу...
// конвертация списка страниц типа 1,3-7,11,21-27,30 в список, раскрытый через запятую
public function pages_convert($pgs) {
if ($pgs==null) return "";
$pgs = trim($pgs);
$pgs = str_replace(" ","",$pgs);
if(!preg_match("/^\d+/",$pgs)) return "";
if(!preg_match("/(\d+)$/",$pgs)) return "";
if (!mb_strpos($pgs,",") and !mb_strpos($pgs,"-")) return $pgs;
if (mb_strpos($pgs,",") and !mb_strpos($pgs,"-")) return $pgs;
if (!mb_strpos($pgs,",") and mb_strpos($pgs,"-")) {
$pgs_arr = explode('-',$pgs);
$pgs = "";
for($i=$pgs_arr[0];$i<=$pgs_arr[1];$i++) {
$pgs .= $i;
if ($i<$pgs_arr[1]) $pgs.=",";
}
return $pgs;
}
$pgs_arr = explode(',',$pgs);
$pgs = "";
for($i=0;$i<count($pgs_arr);$i++) {
if (!mb_strpos($pgs_arr[$i],"-")) {
$pgs .= $pgs_arr[$i];
} else {
$pgs_arr2 = explode('-',$pgs_arr[$i]);
$pgs2 = "";
for($j=$pgs_arr2[0];$j<=$pgs_arr2[1];$j++) {
$pgs2 .= $j;
if ($j<$pgs_arr2[1]) $pgs2.=",";
}
$pgs .= $pgs2;
}
if ($i<count($pgs_arr)-1) $pgs.=",";
}
return $pgs;
}
Изменено ruslan_stef (15.04.2019 15:15:02)
Не в сети
блин, капец.
этот тот случай, когда тебя надо бросить в воду, чтобы ты научился плавать.
и бросить туда, где поглубже и ёжики ждут твоей попы
я выше написал - используй array-функции, - парсить регуляркой? действительно насмешил.
Не в сети
Мне из формы ввода приходит строка.
Я ее превращаю в массив, но перед этим смотрю нужно ли это.
Например, если нет ни запятых, ни тире - то это просто единичный номер страницы - можно не обрабатывать.
Если есть запятые, но нет тире, то это правильное перечисление и парсить его не надо - тоже сразу возвращаю.
Можно было конечно сначала распарсить по запятым, потом элементы парсить по дефису...
Регулярку можно использовать, чтобы убедиться, что входящая строка состоит только из цифр, запятых и тире - написал сначала только проверку на начало и конец строки - нужно просто переделать.
Но вообще-то я ждал пример библиотеки, которую можно было бы использовать. Неужели никто такой не знает?
Не в сети
на тебе халяву!
$str = '1,3,4,5,7,9,10,11,12,13,22';
$arr = explode(',',$str);
function traverse( $arr )
{
$return = [];
$x = 0;
foreach( $arr as $a )
{
$_next = $a+1;
if ( in_array( $_next, $arr ) )
{
$return[$x][] = $a;
}
else
{
$return[$x][] = $a;
$x++;
}
}
return $return;
};
На выхлопе Х групп, содержащих Y элементов/
Array
(
[0] => Array
(
[0] => 1
)
[1] => Array
(
[0] => 3
[1] => 4
[2] => 5
)
[2] => Array
(
[0] => 7
)
[3] => Array
(
[0] => 9
[1] => 10
[2] => 11
[3] => 12
[4] => 13
)
[4] => Array
(
[0] => 22
)
)
Изменено hzone (16.04.2019 15:27:09)
Не в сети
Первое: перечисление типа 5,6,7,10,15,16,17,21,29 преобразовать в 5-7,10,15-17,21,29
<?php
$s = '5,6,7,10,15,16,17,21,29';
$a = [];
$prev = $start = null;
foreach (json_decode("[$s,0]") as $n) {
if ($n - 1 !== $prev) {
$start === null or $a[] = $start === $prev ? $start : "$start-$prev";
$start = $n;
}
$prev = $n;
}
echo join(',', $a);
Второе: перечисление типа 5-7,10,15-17,21,29 преобразовать в 5,6,7,10,15,16,17,21,29
<?php
$s = '5-7,10,15-17,21,29';
$a = [];
foreach (explode(',', $s) as $pair) {
list($start, $end) = explode('-', $pair) + ['', ''];
$end === '' and $end = $start;
while ($start <= $end) { $a[] = $start++; }
}
echo join(',', $a);
Не в сети
Страницы 1