在php中将数组元素转换为范围

Vis*_*tty 8 php arrays range

我正在研究一组数值.

我在PHP中有以下数值的数组

11,12,15,16,17,18,22,23,24
Run Code Online (Sandbox Code Playgroud)

而我正试图将其转换为范围,例如在上述情况下它将是:

11-12,15-18,22-24
Run Code Online (Sandbox Code Playgroud)

我不知道如何将其转换为范围.

the*_*ker 8

你必须自己编码;-)

算法很简单:

  • 迭代这些项目.
  • 记住上一个项目和范围的开始.
  • 对于每个项目(第一个除外)检查:
    • 如果currentItem = prevItem + 1那时你没有找到新的范围.继续.
    • 否则你的范围已经结束.记下范围.你已经记住了范围的开始.结束是前一项.新范围从当前项开始.
    • 第一项始终开始新范围.记住这个作为范围的开始.
  • 离开循环时不要忘记记下当前范围.


dav*_*vur 5

我之前使用过这个,它可以解决问题.

将逗号分隔的数字字符串作为输入.sort如果保证数字已经被排序,则可以忽略呼叫.

function range_string($csv)
{
    // split string using the , character
    $number_array = array_map('intval', explode(',', $csv));
    sort($number_array);

    // Loop through array and build range string
    $previous_number = intval(array_shift($number_array)); 
    $range = false;
    $range_string = "" . $previous_number; 
    foreach ($number_array as $number) {
      $number = intval($number);
      if ($number == $previous_number + 1) {
        $range = true;
      }
      else {
        if ($range) {
          $range_string .= "-$previous_number";
          $range = false;
        }
        $range_string .= ",$number";
      }
      $previous_number = $number;
    }
    if ($range) {
      $range_string .= "-$previous_number";
    }

    return $range_string;
}

$csv_string = "11,16,12,17,18,15,22,23,24";
print range_string($csv_string); // 11-12,15-18,22-24
Run Code Online (Sandbox Code Playgroud)