Преобразование строки

Zadov

Новичок
Есть строка типа:
$str = "1020, 1023, 1024, 1025, 1026, 1027, 1028, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1050, 2879";

Мне нужно преобразовать ее к виду:
$str = "1020, 1023-1028, 1031-1048, 1050, 2879";

Что лучше юзать?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
На бумажке продумать логику и написать код
 

Zadov

Новичок
Сделал так

Код:
$summary = "";
if ( ($error == "none") && (isset($_GET['vlan_free'])) ) {
$pred = 0;
        foreach ( $vlans as $key => $value ) {
                if ( $value['all'] == 0 ) {
                        if ($value['id'] == $pred + 1){
                                $summary .= "-" . $value['id'];
                        } else {
                                $summary .= "," . $value['id'];
                        }
                        $pred =  $value['id'];
                }
                $summary = ltrim($summary, ",");
                $summary1 = [];
                $summary1 = explode(',', $summary);


                foreach ( $summary1 as $value3 ) {
                         if (preg_match('~-~', $value3)) {
                                $value1 = stristr($value3, '-', true);
                                $value2 = stristr($value3, '-');
                                $value3 = $value1 . "-" . $value2;
                        }
                }

                $summary = implode(',', $summary1);
                $summary = str_replace(",",", ",$summary);

        }
}
Но почему-то не срабатывает foreach ( $summary1 as $value3 ) {
(Именно foreach, а не preg_match)

$summary1 получается:
Array
(
[0] => 1020
[1] => 1023-1024-1025-1026-1027-1028
[2] => 1031-1032-1033-1034-1035-1036-1037-1038-1039-1040-1041-1042-1043-1044-1045-1046-1047
[3] => 1051-1052
)
 

Zadov

Новичок
<?php
$summary = "1020,1023-1024-1025-1026-1027-1028,1031-1032-1033-1034-1035-1036-1037-1038-1039-1040-1041-1042-1043-1044-1045-1046-1047-1048,1050,2879";
$summary1 = [];
$summary1 = explode(',', $summary);


foreach ( $summary1 as $value3 ) {
$value3 = "test";

}


print_r ($summary1);


?>

RESULT:

Array
(
[0] => 1020
[1] => 1023-1024-1025-1026-1027-1028
[2] => 1031-1032-1033-1034-1035-1036-1037-1038-1039-1040-1041-1042-1043-1044-1045-1046-1047-1048
[3] => 1050
[4] => 2879
)

Не могу понять, что не так с foreach
 

fixxxer

К.О.
Партнер клуба
PHP:
function convertSortedCsvToRanges($str)
{
    return join(', ', array_map(function($item) {
        return $item[0] === $item[1] ? "$item[0]": "$item[0]-$item[1]";
    }, array_reduce(array_map('intval', explode(',', $str)), function ($carry, $item) {
        $len = count($carry) - 1;
        if ($len < 0 || $item - $carry[$len][1] !== 1) {
            $carry[] = [$item, $item];
        } else {
            $carry[$len][1] = $item;
        }
        return $carry;
    }, [])));
}

$str = "1020, 1023, 1024, 1025, 1026, 1027, 1028, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1050, 2879";
$result = convertSortedCsvToRanges($str);
assert($result === "1020, 1023-1028, 1031-1048, 1050, 2879");
;)
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
О, спасибо за пример. Я как раз собирался поэкспериментировать с array_reduce().
 
Сверху