【问题标题】:PHP : Insert an array into another arrayPHP:将一个数组插入另一个数组
【发布时间】:2015-09-19 17:30:21
【问题描述】:

我正在尝试规范化一串逗号分隔的数字,以及一个范围。演示:

数组:

$array = ["1","2","5-10","15-20"];

应该变成:

$array = [1,2,5,6,7,8,9,10,15,16,17,18,19,20];

我正在研究的算法是:

//get the array values with a range in it :
$rangeArray = preg_grep('[-]',$array);

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

foreach($rangeArray as $index=>$value){
    $rangeVal = explode('-',$value);
    $convertedArray = range($rangeVal[0],$rangeVal[1]);
}

转换后的数组现在将包含 ["5","6","7","8","9","10"];

我现在面临的问题是,如何在原始数组中弹出值“5-10”,并将值插入到$convertedArray中,这样我就可以得到价值:

$array = ["1","2","5","6","7","8","9","10","16-20 "];

那么,如何将数组插入到数组中?或者有没有更清洁的方法来解决这类问题?将数字和范围值的数组转换为正确排序的数字数组?

【问题讨论】:

  • array_splice() 是您要求的功能,但如果您不关心条目的顺序,您也可以使用 array_merge()
  • 你能举个例子说明我如何在我的情况下使用它吗?
  • 我尝试了数组合并,但是我必须消除那些具有“5-10”和其他范围值的值,然后在该范围字符串的索引中插入“标准化”值。
  • array_splicerange() 结合起来,您应该可以为所欲为。
  • 检查我的编辑@muffin

标签: php arrays arraylist insert array-merge


【解决方案1】:

给你。 我试图尽可能地减少代码。

考虑下面的初始数组,

$array = ["1","2","5-10","15-20"];

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

$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 变成了,

$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 开始的数字升序
  • 仅当给定数组按单个成员和范围成员组合的升序排列时,才会对新数组进行排序

【讨论】:

    【解决方案2】:

    你没有完成一点

    $array = ["1","2","5-10","15-20"];
    // need to reverse order else index will be incorrect after inserting
    $rangeArray = array_reverse( preg_grep('[-]',$array), true);
    
    $convertedArray = $array;
    
    foreach($rangeArray as $index=>$value) {
    
        $rangeVal = explode('-',$value);
        array_splice($convertedArray, $index, 1, range($rangeVal[0],$rangeVal[1]));
    }
    
    print_r($convertedArray);
    

    【讨论】:

      【解决方案3】:

      更简单、更简短的答案。

      See in Ideone

      $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);
      

      【讨论】:

      • 它的作用是:["1","2",array(),array()];
      • 演示也是错误的。如果您查看原始数组的索引 2,它内部包含另一个数组。
      • @muffin 更新了,看看吧。
      【解决方案4】:

      你来了,伙计。

      <?php
      $array = ["1","2","5-10","15-20"];
      $newArr = array();
      foreach($array as $item){
          if(strpos($item, "-")){
              $temp = explode("-", $item);
              $first = (int) $temp[0];
              $last = (int) $temp[1];
              for($i = $first; $i<=$last; $i++){
                  array_push($newArr, $i);
              }
          }
          else
              array_push($newArr, $item);
      }
      print_r($newArr);
      ?>
      

      【讨论】:

        【解决方案5】:

        试试这个:

        $array = ["1","2","5-10","15-20"];
        $result = [];
        
        foreach ($array as $a) {
            if (strpos($a,"-")!== false){
                $tmp = explode("-",$a);
                for ($i = $tmp[0]; $i<= $tmp[1]; $i++) $result[] = $i;
            } else {
                $result[] = $a;
            }
        }
        
        var_dump($result);
        

        【讨论】:

          【解决方案6】:

          找出最小值和最大值并用它们创建数组更容易。这是一个例子:

          $in = ["1","2","5-10","15-20"];
          $out = normalizeArray($in);
          var_dump($out);
          
          function normalizeArray($in)
          {
              if(is_array($in) && sizeof($in) != 0)
              {
                  $min = null;
                  $max = null;
                  foreach($in as $k => $elem)
                  {
                      $vals = explode('-', $elem);
                      foreach($vals as $i => $val)
                      {
                          $val = intval($val);
                          if($min == null || $val < $min)
                          {
                              $min = $val;
                          }
                          if($max == null || $val > $max)
                          {
                              $max = $val;
                          }
                      }
                  }
          
                  $out = array();
                  for($i = $min; $i <= $max; $i++)
                  {
                      $out[] = $i;
                  }
          
                  return $out;
              }
              else
              {
                  return array();
              }
          }
          

          【讨论】:

            【解决方案7】:

            试试这个:

            <?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>";
            

            结果:

            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
            )
            

            问题解决了!

            【讨论】:

              【解决方案8】:

              使用 range 和 array_merge 处理非数字值:

              $array = ["1","2","5-10","15-20"];
              
              $newArray = [];
              array_walk(
                  $array,
                  function($value) use (&$newArray) {
                      if (is_numeric($value)) {
                          $newArray[] = intval($value);
                      } else {
                          $newArray = array_merge(
                              $newArray,
                              call_user_func_array('range', explode('-', $value))
                          );
                      }
                  }
              );
              
              var_dump($newArray);
              

              【讨论】:

                猜你喜欢
                • 2014-05-01
                • 2011-08-09
                • 2012-10-18
                • 1970-01-01
                • 1970-01-01
                • 2019-04-14
                • 2015-08-07
                • 2013-04-11
                • 1970-01-01
                相关资源
                最近更新 更多