首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数字数组和连字符数字范围扩展为整数数组。

将数字数组和连字符数字范围扩展为整数数组。
EN

Stack Overflow用户
提问于 2015-07-02 09:09:11
回答 8查看 14.9K关注 0票数 12

我试图规范/展开/水合物/转换一个数字字符串以及连字符分隔的数字(作为范围表达式),以便它成为一个整数值数组。

样本输入:

代码语言:javascript
运行
复制
$array = ["1","2","5-10","15-20"];

应成为:

代码语言:javascript
运行
复制
$array = [1,2,5,6,7,8,9,10,15,16,17,18,19,20];

我正在研究的算法是:

代码语言:javascript
运行
复制
//get the array values with a range in it :
$rangeArray = preg_grep('[-]',$array);

这将包含["5-10", "16-20"];

代码语言:javascript
运行
复制
foreach($rangeArray as $index=>$value){
    $rangeVal = explode('-',$value);
    $convertedArray = range($rangeVal[0],$rangeVal[1]);
}

转换后的数组现在将包含"5“、"6”、"7“、"8”、"9“、"10"

我现在面临的问题是,如何在原始数组中弹出"5-10“值,并在$convertedArray,中插入这些值,这样我就有了这个值:

代码语言:javascript
运行
复制
$array = ["1","2",**"5","6","7","8","9","10"**,"16-20"];

如何插入一个或多个值来代替范围字符串?或者,是否有一种更干净的方法将数字和范围值的数组转换为正确排序的数字数组?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2015-07-02 09:21:59

尝试如下:

代码语言:javascript
运行
复制
<?php
$array = ["1","2","5-10","15-20"];

$newdata = array();
foreach($array as $data){
    if(strpos($data,'-')){

        $range = explode('-', $data);
        for($i=$range[0];$i<=$range[1];$i++){
            array_push($newdata, $i);
        }
    }
    else{
        array_push($newdata, (int)$data);
    }

}

        echo "<pre>";
print_r($array);
        echo "</pre>";
        echo "<pre>";
print_r($newdata);
        echo "</pre>";

结果:

代码语言:javascript
运行
复制
Array
(
    [0] => 1
    [1] => 2
    [2] => 5-10
    [3] => 15-20
)
Array
(
    [0] => 1
    [1] => 2
    [2] => 5
    [3] => 6
    [4] => 7
    [5] => 8
    [6] => 9
    [7] => 10
    [8] => 15
    [9] => 16
    [10] => 17
    [11] => 18
    [12] => 19
    [13] => 20
)

问题解决了!

票数 3
EN

Stack Overflow用户

发布于 2015-07-02 09:21:53

这就是你要的。我尽量将代码最小化。

考虑下面的初始数组,

代码语言:javascript
运行
复制
$array = ["1","2","5-10","15-20"];

如果您想要用它而不是$array创建一个新数组,请将$array的第一次出现下面更改为您想要的任何名称,

代码语言:javascript
运行
复制
$array = call_user_func_array('array_merge', array_map(function($value) {
            if(1 == count($explode = explode('-', $value, 2))) {
                return [(int)$value];
            }
            return range((int)$explode[0], (int)$explode[1]);
        }, $array));

现在,$array变成,

代码语言:javascript
运行
复制
$array = [1,2,5,6,7,8,9,10,15,16,17,18,19,20];

备注:

  • 将每个转换成员转换为整数。
  • 如果提供了15-20-25,则将15-20考虑在内,而忽略其余的
  • 如果提供15a-20b,将其作为15-20处理,这是-爆炸后将套管改为整数的结果,15a变为15
  • 将数组键转换为从0开始的数字升序。
  • 只有当给定数组按单个成员和范围成员组合的升序排序时,才对新数组进行排序。
票数 4
EN

Stack Overflow用户

发布于 2015-07-02 09:17:22

简单而简短的答案。

见“理想国”

代码语言:javascript
运行
复制
$new_array = array();  

foreach($array as $number){
  if(strpos($number,'-')){
     $range = explode('-', $number);  
     $new_array = array_merge($new_array, range($range[0],$range[1]));
  } 
  else{
     $new_array[] = (int) $number;
  }
}

var_dump($new_array);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31180277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档