2011-10-26 30 views
6

我有一個這樣的數組:查找號碼列表差距

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 10 
    [4] => 11 
    [5] => 12 
    [6] => 13 
    [7] => 14 
    [8] => 23 
    [9] => 24 
    [10] => 25 
) 

,我想填補國內空白,所以它看起來是這樣的:

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => xxx 
    [4] => 10 
    [5] => 11 
    [6] => 12 
    [7] => 13 
    [8] => 14 
    [9] => xxx 
    [10] => 23 
    [11] => 24 
    [12] => 25 
) 

如果你看一下值的第一個數組有1,2,3,然後一個空白,然後10,11,12,13,14,然後一個差距,然後23,24,25 ..我怎樣才能以編程方式找到這些差距,並添加一個新的數組元素在其位置

最多會有兩個間隙。

我想不出一個很好的方法來做到這一點,任何想法?謝謝。

+0

你能解釋得更好嗎? –

+0

我加了一個更好的解釋。 – 472084

回答

2

一個簡單for循環,而不復制該數組,但只有改變原來的:

$repl = 'xxx'; 

for ($i=1; $i<count($array); $i++) { 
    $valueR = $array[$i]; 
    $valueL = $array[$i-1] === $repl ? $array[$i-2] : $array[$i-1]; 
    if ($valueR > $valueL + 1) { 
     array_splice($array, $i++, 0, $repl); 
    } 
} 
+0

減少空間複雜度+1 – Jordan

1

我會做這樣的事情,而不是測試,但應該工作:)

$oldArray = array(1,2,3,10,11,12,13,24,25,26,27); 

$newArray = array(); 
for($i=0;$i<count($oldArray);$i++){ 
    $newArray[] = $oldArray[$i]; 
    if($oldArray[$i+1] - $oldArray[$i] != 1 && $i+1 != count($oldArray)) 
     $newArray[] = "xxx"; // seperator 
} 

var_dump($newArray); 

夏嘉曦

+0

這似乎在數組的末尾添加了一個額外的xxx? – 472084

+0

檢查更新的代碼,添加一個檢查,以確保這不是最後一個項目。 –

1
$result = array(); 
if (count($oldArray) > 0) 
{ 
    $result[] = $oldArray[0]; 
    for ($i=1; $i<count($oldArray); $i++) 
    { 
     if ($oldArray[$i]-$oldArray[$i-1] != 1) 
      $result[] = "xxx"; 
     $result[] = $oldArray[$i]; 
    } 
} 
+0

這將刪除一些原始數組元素。 – 472084

+0

@Jagle老答案做到了;不是更新的那個。 –

+0

@Hanan Khan:你有兩個語法錯誤(缺少'$')。我不明白在這一點上'count($ result)'可以大於0。 – netcoder