Есть строка типа: $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"; Что лучше юзать?
Ну я бы сначала сделал Код (Text): explode(', ', $str) А затем циклом прошёлся бы по массиву и собрал бы обратно в строку, но проверяя соседние элементы. Может кто-то предложит способ красивее.
PHP: <?php $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, 1049, 1051, 1052"; $new = []; $old = explode(",",$str); $old = array_map(function($e){ return (int) trim($e);}, $old); function summarize($arr){ $last = null; $skips = 1; $arr[] = null; foreach($arr as $num){ if(is_null($last)){ $last = $num; continue; } if($last+$skips == $num){ $skips++; }else{ if($skips > 1){ yield $last."-".($last+($skips-1)); $skips = 1; }else{ yield $last; } $last = $num; } } } foreach(summarize($old) as $k){ var_dump($k); } Есть куда упрощать.
Сделал так Код (Text): $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 )
Ресурс в среднем выдаёт в моём случае 0.00011706352233887 (что, в принципе, норм), свой код меряйте сами. PHP: $timestart = microtime(true); // your code goes here print microtime(true) - $timestart;
<?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