Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 14.04.2019 08:56:49

ruslan_stef
Откуда: Оренбург
Сообщений: 10

Преобразование списков страниц туда и обратно

Добрый день, коллеги!
Помогите пожалуйста найти готовые решения или библиотеки, которые бы позволяли сделать пару вещей.
Первое: перечисление типа 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
Обе функции я написал, конечно, но думаю, что достаточно коряво wink Хотелось бы посмотреть на опыт профессионалов, но что-то найти не могу. Наверное вопрос неправильно формулирую.

Не в сети

#2 15.04.2019 14:30:22

Re: Преобразование списков страниц туда и обратно

Такое ощущение, что тебе поставили тестовое задание перед наёмом на работу и ты решил отиграться вот таким интересным способом ☺

И про «написал функции», как-то бездоказательно в ключе моей догадки ☺

Не в сети

#3 15.04.2019 14:32:00

Re: Преобразование списков страниц туда и обратно

короче:
работай с массивами методами массивов, и НЕ пытайся писать велосипеды (я про рнр-функции).

Изменено hzone (15.04.2019 14:32:36)

Не в сети

#4 15.04.2019 15:12:13

ruslan_stef
Откуда: Оренбург
Сообщений: 10

Re: Преобразование списков страниц туда и обратно

Да нет же, дело чисто по работе
Просто реально говорю, что функции корявенькие.
Вот первая, например: (Но она проще, как мне показалось... ) smile
Могу скинуть вторую - но она вообще монстр! Поэтому и ищу...

	// конвертация списка страниц типа 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)

Не в сети

#5 16.04.2019 14:53:39

Re: Преобразование списков страниц туда и обратно

блин, капец.

этот тот случай, когда тебя надо бросить в воду, чтобы ты научился плавать.

и бросить туда, где поглубже и ёжики ждут твоей попы smile

я выше написал - используй array-функции, - парсить регуляркой? действительно насмешил.

Не в сети

#6 16.04.2019 15:11:27

ruslan_stef
Откуда: Оренбург
Сообщений: 10

Re: Преобразование списков страниц туда и обратно

Мне из формы ввода приходит строка.
Я ее превращаю в массив, но перед этим смотрю нужно ли это.
Например, если нет ни запятых, ни тире - то это просто единичный номер страницы - можно не обрабатывать.
Если есть запятые, но нет тире, то это правильное перечисление и парсить его не надо - тоже сразу возвращаю.
Можно было конечно сначала распарсить по запятым, потом элементы парсить по дефису...
Регулярку можно использовать, чтобы убедиться, что входящая строка состоит только из цифр, запятых и тире - написал сначала только проверку на начало и конец строки - нужно просто переделать.
Но вообще-то я ждал пример библиотеки, которую можно было бы использовать. Неужели никто такой не знает?

Не в сети

#7 16.04.2019 15:25:26

Re: Преобразование списков страниц туда и обратно

на тебе халяву!

$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)

Не в сети

#8 16.04.2019 16:47:19

Re: Преобразование списков страниц туда и обратно

Первое: перечисление типа 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);

Не в сети

Подвал раздела