Первое: перечисление типа 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);
$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
)
)
этот тот случай, когда тебя надо бросить в воду, чтобы ты научился плавать.
и бросить туда, где поглубже и ёжики ждут твоей попы
я выше написал - используй array-функции, - парсить регуляркой? действительно насмешил.
]]> // конвертация списка страниц типа 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;
}
И про «написал функции», как-то бездоказательно в ключе моей догадки
]]>