2014-10-16 85 views
1

比方說,我有一個數組這種結構PHP轉換字符串

$array = Array(Array('a' => 'a', 'x' => $something)); 

變量$的東西可以是這樣的:1-3或1,3或1-3,2-5。我什麼改造變量$陣列中:

情況1 $東西= 1-3

$array = Array(Array('a' => 'a', 'x' => Array(1,2,3))); 

病例2 $東西= 1,3

$array = Array(Array('a' => 'a', 'x' => Array(1,3))); 

案例3 .. $ something = 1-3,2-5

$array = Array(Array('a' => 'a', 'x' => Array(1,2,3,4,5))); 

我試圖使用preg_match,但它不起作用。你能否給我暗示使用別的東西?

回答

0

你有

$array = Array(Array('a' => 'a', 'x' => $something)); 

要修改這個數組內的 'X' 的內容。 (你不要修改$某物)。

$array[0]['x'] = Array(1,2,3); 

$陣列[0] [ 'X'] =陣列(1,2,3,4,5);

1

您正在尋找explode分割您輸入的字符串,range生成陣列的內容和array_merge到結果合併。

事情是這樣工作的:

<?php 
$something = '1-3, 2-5'; 
$array = array(array('a' => 'a', 'x' => array())); 

$result = array(); 

foreach (explode(', ', $something) as $input) { 
    $rangeParts = explode('-', $input); 
    $result = array_merge($result, range($rangeParts[0], $rangeParts[1]));  
} 

// contains duplicate entries because 1-3 and 2-5 overlap - use array_unique to remove duplicates or change input 
$array[0]['x'] = $result; 

在過去的作業中,你可以換$resultarray_unique以1:1匹配您的例子編輯輸入($something),以正確反映包容/獨家範圍函數的規則。

+0

太謝謝你了! – OsomA 2014-10-16 10:03:28

+0

我真的懷疑上面的代碼產生了期望的結果。檢查php手冊中的爆炸函數(第一個參數是分隔符)。 – geoandri 2014-10-16 10:46:55

+0

他的想法不起作用,但至少我有一個開始。對於案例$ something ='1,3'它不起作用 – OsomA 2014-10-16 11:07:39

0

如果$裏面的東西的價值總是被分類爲您的例子表明,你可以使用下面的代碼

$newomething = range(substr($something, 0, 1),substr($something, -1)); 

UPDATE工作液與不排序的輸入。 下面的代碼將在工作的投入像

$something= '4,5,1-3,13,7-9'; 

    $something = explode(',',$something); 
    $result= array(); 
    foreach($something as $value) 
    { 
     if (strpos($value,'-') !== false) 
     { 
     $r = explode('-',$value); 
     $rad = range($r[0],$r[1]); 
     $result = array_merge($result,$rad); 
     } 
     else 
     { 
     array_push($result,$value); 
     } 
    } 
    sort($result); 
+0

此代碼不適用於$ something ='1,3',因爲它生成Array(1,2,3),結果必須是Array(1,3) – OsomA 2014-10-16 11:14:46

+0

您是對的。我失去了一些東西 – geoandri 2014-10-16 11:27:24

+0

更新的代碼,以輸入的所有可能組合工作 – geoandri 2014-10-16 12:50:55

0

這是我sugestion,我希望能爲你工作:

$something = "1,2,3,4"; 

$array = Array(Array('a' => 'a', 'x' => $something)); 

if(preg_match('/(\d+\-\d+(\,?))+/', $array[0]['x'], $m)) 
{ 
    $x_values = Array(); 
    $sets  = explode(',', $m[0]); 

    foreach($sets as $set) 
    { 
     preg_match('/(\d+)\-(\d+)/', $set, $m); 
     $start  = $m[1]; 
     $end  = $m[2]; 

     for($i = $start; $i <= $end; $i++) 
     { 
      if(in_array($i, $x_values)) 
      { 
       continue; 
      } 

      array_push($x_values, $i); 
     } 
    } 

    $array[0]['x'] = $x_values; 
} 
else if(preg_match('/(\d+)\-(\d+)/', $array[0]['x'], $m)) 
{ 
    $x_values = Array(); 
    $start  = $m[1]; 
    $end  = $m[2]; 

    for($i = $start; $i <= $end; $i++) 
    { 
     array_push($x_values, $i); 
    } 

    $array[0]['x'] = $x_values; 
} 
else if(preg_match('/\d+\,\d+/', $array[0]['x'], $m)) 
{ 
    $x_values = explode(',', $array[0]['x']); 
    $array[0]['x'] = $x_values; 
} 
+0

您的代碼正在工作,我第一次嘗試這樣的事情,但我認爲這個簡單的問題可能是另一種解決方案 – OsomA 2014-10-16 11:11:45