2015-07-02 15 views
12

Próbuję znormalizować ciąg liczb rozdzielonych przecinkami, a także zakres. Aby wykazać, że:PHP: wstaw tablicę do innej tablicy

tablicę:

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

powinny stać się:

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

algorytmu pracuję na to:

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

ta będzie zawierać ["5-10", "16-20"]; Następnie:

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

Przekształcona tablica będzie teraz zawierała ["5", "6", "7", "8", "9", "10"];

Problem I teraz twarz jest taka, że ​​jak mogę wyskoczyć wartość „5-10” w oryginalnej tablicy, a następnie włóż wartości w $ convertedArray, tak że będę mieć wartość:

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

Jak wstawić tablicę do tablicy? Czy istnieje czystszy sposób rozwiązania tego rodzaju problemu? przekształca tablicę liczb i wartości zakresu w tablicę poprawnie zsekwencjonowanych liczb?

+2

[array_splice()] (http://www.php.net/manual/en/function.array-splice.php) jest funkcją prosisz, chociaż można również użyć [array_merge()] (http://www.php.net/manual/en/function.array-merge.php) jeśli nie dbasz o kolejność wpisów –

+0

czy możesz podać przykład, w jaki sposób mogę go użyć w mój przypadek? – muffin

+0

Próbowałem scalania tablicy, ale wtedy musiałbym wyeliminować te z wartościami "5-10" i innymi wartościami zakresu, a następnie wstawić "znormalizowane" wartości w indeksie tego łańcucha zakresu. – muffin

Odpowiedz

4

Spróbuj tego:

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

Wynik:

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 
) 

Problem rozwiązany!

2

Prostsza i krótsza odpowiedź.

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

co to jest: ["1", "2", array(), array()]; – muffin

+0

Demo też jest błędne .. jeśli spojrzysz na indeks 2 oryginalnej tablicy, zawiera ona w sobie inną tablicę. – muffin

+0

@muffin Zaktualizowany, spójrz. – Muhammet

2

Korzystanie zakres i array_merge obsłużyć wartości nienumeryczne:

$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

Tutaj jesteś. Próbowałem zminimalizować kod tak bardzo, jak tylko mogę.

Rozważmy początkowy tablicy poniżej,

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

Jeśli chcesz utworzyć nową tablicę z niego zamiast $array, zmiana poniżej pierwszym wystąpieniu z $array na dowolną nazwę,

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

teraz $array staje

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

Uwagi:

  • odlewnictwa każdy zwerbowany członek do liczby całkowitej
  • Jeśli 15-20-25 jest, bierze 15-20 pod uwagę i ignoruje resztę
  • Jeśli 15a-20b jest, traktowane jako 15-20, to jest wynikiem obudowa do liczby całkowitej po rozbiciu z -, 15a staje się 15
  • Rzuca klucze tablicy do numerycznego porządku rosnącego począwszy od fr om 0
  • Nowa tablica jest posortowana tylko wtedy, gdy dana tablica jest w porządku rosnącym pojedynczych członków i zakres połączeniu
2

Łatwiej jest znaleźć minimalną i maksymalną wartość i utworzyć z nimi tablicę. Oto przykład:

$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

spróbuj tego:

$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

ty nie dokończyć trochę

$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

tutaj idziesz kolego.

<?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); 
?> 
Powiązane problemy