 Laravel по-русски
Laravel по-русски
      
      
    Русское сообщество разработки на 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