За последние 24 часа нас посетили 16489 программистов и 1677 роботов. Сейчас ищут 913 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем Horus1613, 10 окт 2017.

  1. Horus1613

    Horus1613 Новичок

    С нами с:
    25 май 2017
    Сообщения:
    34
    Симпатии:
    0
    Есть строка типа:
    $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";

    Что лучше юзать?
     
  2. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    Ну я бы сначала сделал
    Код (Text):
    1. explode(', ', $str)
    А затем циклом прошёлся бы по массиву и собрал бы обратно в строку, но проверяя соседние элементы. Может кто-то предложит способ красивее.
     
    MouseZver нравится это.
  3. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    PHP:
    1. <?php
    2. $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";
    3.  
    4. $new = [];
    5. $old = explode(",",$str);
    6. $old = array_map(function($e){ return (int) trim($e);}, $old);
    7.  
    8.  
    9. function summarize($arr){
    10.     $last = null;
    11.     $skips = 1;
    12.     $arr[] = null;
    13.     foreach($arr as $num){
    14.         if(is_null($last)){
    15.             $last = $num;
    16.             continue;
    17.         }
    18.         if($last+$skips == $num){
    19.             $skips++;
    20.         }else{
    21.             if($skips > 1){
    22.                 yield $last."-".($last+($skips-1));
    23.                 $skips = 1;
    24.             }else{
    25.                 yield $last;
    26.             }
    27.             $last = $num;
    28.         }
    29.     }
    30.    
    31. }
    32.  
    33. foreach(summarize($old) as $k){
    34.     var_dump($k);
    35. }
    Есть куда упрощать.
     
  4. Horus1613

    Horus1613 Новичок

    С нами с:
    25 май 2017
    Сообщения:
    34
    Симпатии:
    0
    Сделал так

    Код (Text):
    1.  
    2. $summary = "";
    3. if ( ($error == "none") && (isset($_GET['vlan_free'])) ) {
    4. $pred = 0;
    5.         foreach ( $vlans as $key => $value ) {
    6.                 if ( $value['all'] == 0 ) {
    7.                         if ($value['id'] == $pred + 1){
    8.                                 $summary .= "-" . $value['id'];
    9.                         } else {
    10.                                 $summary .= "," . $value['id'];
    11.                         }
    12.                         $pred =  $value['id'];
    13.                 }
    14.                 $summary = ltrim($summary, ",");
    15.                 $summary1 = [];
    16.                 $summary1 = explode(',', $summary);
    17.  
    18.  
    19.                 foreach ( $summary1 as $value3 ) {
    20.                          if (preg_match('~-~', $value3)) {
    21.                                 $value1 = stristr($value3, '-', true);
    22.                                 $value2 = stristr($value3, '-');
    23.                                 $value3 = $value1 . "-" . $value2;
    24.                         }
    25.                 }
    26.  
    27.                 $summary = implode(',', $summary1);
    28.                 $summary = str_replace(",",", ",$summary);
    29.  
    30.         }
    31. }
    Но почему-то не срабатывает 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
    )
     
  5. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Ресурс в среднем выдаёт в моём случае 0.00011706352233887 (что, в принципе, норм), свой код меряйте сами.
    PHP:
    1. $timestart = microtime(true);
    2. // your code goes here
    3. print microtime(true) - $timestart;
     
  6. Horus1613

    Horus1613 Новичок

    С нами с:
    25 май 2017
    Сообщения:
    34
    Симпатии:
    0
    <?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
     
  7. Horus1613

    Horus1613 Новичок

    С нами с:
    25 май 2017
    Сообщения:
    34
    Симпатии:
    0
    разобрался