2015-07-02 26 views
12

Tôi đang cố gắng chuẩn hóa một chuỗi các số được phân cách bằng dấu phẩy và một phạm vi. Để chứng minh:PHP: Chèn một mảng vào một mảng khác

mảng:

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

nên trở thành:

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

Thuật toán tôi đang làm việc trên là:

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

này sẽ chứa ["5-10", "16-20"]; Sau đó:

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

Mảng được chuyển đổi giờ đây sẽ chứa ["5", "6", "7", "8", "9", "10"];

Vấn đề bây giờ tôi phải đối mặt là, làm thế nào để tôi bật ra giá trị "5-10" trong mảng ban đầu, và chèn các giá trị trong $ convertedArray, vì vậy mà tôi sẽ có giá trị:

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

Vì vậy, làm cách nào để chèn mảng vào mảng? Hay có cách nào khác để giải quyết vấn đề này? chuyển đổi mảng của cả hai số và giá trị phạm vi thành mảng của các số thứ tự đúng?

+2

[array_splice()] (http://www.php.net/manual/en/function.array-splice.php) là hàm bạn đang yêu cầu, mặc dù bạn cũng có thể sử dụng [array_merge()] (http://www.php.net/manual/en/function.array-merge.php) nếu bạn không quan tâm đến thứ tự của các mục nhập –

+0

bạn có thể cung cấp một ví dụ về cách tôi có thể sử dụng nó trong trường hợp của tôi? – muffin

+0

tôi đã thử kết hợp mảng, nhưng sau đó tôi phải loại bỏ những giá trị "5-10" và các giá trị phạm vi khác, sau đó chèn các giá trị "chuẩn hóa" vào chỉ mục của chuỗi phạm vi đó. – muffin

Trả lời

4

Hãy thử điều này:

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

Kết quả:

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 
) 

Sự cố được giải quyết!

2

Câu trả lời đơn giản và ngắn hơn.

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); 
+0

những gì nó làm là: ["1", "2", mảng(), mảng()]; – muffin

+0

bản demo là sai quá .. nếu bạn nhìn vào chỉ số 2 của mảng ban đầu, nó có chứa một mảng bên trong của nó. – muffin

+0

@muffin Đã cập nhật, hãy xem. – Muhammet

2

Sử dụng phạm vi và array_merge để xử lý các giá trị không phải số:

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

Ở đây bạn đi. Tôi đã cố gắng giảm thiểu mã càng nhiều càng tốt.

Hãy xem xét những mảng ban đầu dưới đây,

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

Nếu bạn muốn tạo một mảng mới ra khỏi nó thay vì $array, thay đổi dưới sự xuất hiện đầu tiên của $array cho bất kỳ tên nào bạn muốn,

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

Bây giờ, số $array trở thành,

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

Ghi chú:

  • phôi mỗi thành viên chuyển thành số nguyên
  • Nếu 15-20-25 được cung cấp, mất 15-20 xem xét và bỏ qua phần còn lại
  • Nếu 15a-20b được cung cấp, đối xử như 15-20, đây là kết quả của vỏ thành số nguyên sau khi phát nổ với -, 15a trở thành 15
  • Đặt các khóa mảng thành số thứ tự tăng dần bắt đầu từ fr om 0
  • mảng mới chỉ sắp xếp nếu mảng nhất định là thứ tự tăng dần của các thành viên độc thân và các thành viên phạm vi kết hợp
2

Dễ dàng tìm ra giá trị tối thiểu và tối đa và tạo mảng với chúng. Dưới đây là một ví dụ:

$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(); 
    } 
} 
1

thử điều này:

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

bạn không kết thúc một chút

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

đây bạn đi người bạn đời.

<?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); 
?> 
Các vấn đề liên quan