2010-05-25 34 views
0

我想創建一個函數,它使用數組映射整數的循環模式。PHP - 陣列內的模式

正如如果我的(0,1,3)的起始陣列的例子,我知道我想停止模式時,我打15.

圖案被通過每次一個固定整數遞增(讓我說4)所以我的最終模式應該是..

0 
1 
3 
4 (0 + 4) 
5 (1 + 4) 
7 (2 + 4) 
8 (4 + 4) 
9 (5 + 4) 
11(7 + 4) 
12(8 + 4) 
13(9 + 4) 
15(11+ 4) 

有沒有人有任何關於如何實現這一目標的指針?

我目前的執行工作,但就是愚蠢低效它是這樣的......

$array = array(0,1,3); 
$inc = 4; 
$end = end($array); 
$final = 15; 

while($end < $final) 
{ 
$tmp = array(); 
foreach($array AS $row) 
{ 
$tmp = $row + $inc; 
} 
$array = merge($tmp, $array); 
$end = end($array); 
} 
+0

我不明白你想要哪種模式,因爲你的示例代碼不會給出與列表中相同的模式,所以我回答了你的示例代碼。它是否正確? – 2010-05-25 14:33:06

+1

如果你錯過了你想打的號碼會發生什麼?該程序停止了一個錯誤或什麼? 例如:你想停在14,但你只能有13,然後15 ... – 2010-05-25 14:33:37

+0

對不起,我急於寫代碼,但它是我需要能夠重新創建的最終結果(列表) 。問題是我需要將4添加到數組的每個部分,而不僅僅是它的最後一個元素。 – Toby 2010-05-25 14:42:59

回答

0

我假設你想要在同一個數組中有所有的新值。 所以:

​​3210

此代碼應爲數組中的任何初始值,任何增加值和任何停止值工作。

1
$array = array(0,1,3); 
$inc = 4; 
$final = 15; 
$end = end($array); 

while($end < $final) 
{ 
    $end += $inc; 
    $array[] = $end; 
} 

或用一個for循環:

$array = array(0,1,3); 
$inc = 4; 
$final = 15; 

for($i = end($array) + $inc; $i <= $final; $i += $inc) 
{ 
    $array[] = $i; 
} 
+1

你必須包含15.所以'$ end <= $ final' ** < = **標誌應該被使用。 – 2010-05-25 14:26:52

+1

SergeanT,15將被包含,因爲$ end只在循環內部增加。 – 2010-05-25 14:28:46

+0

這是行不通的,因爲第一個結果是7,而不是4(0 + 4)。 – Toby 2010-05-25 14:41:51

0
<?php 

function myArrayFunction(array $array, $inc = 4, $final = 15, $end = null) 
{ 
    if(!$end) 
    { 
     $end = end($array); 
    } 

    while($end < $final) 
    { 
     $end += $inc; 
     $array[] = $end; 
    } 

    return $array; //assume you're wanting $array back 
} 

這是減去任何形式測試或檢查注入值,但你明白了。

+0

他們可能會傳入'$ end = 0'。你可能想在設置它之前檢查'isset($ end)'而不是'(!$ end)'。 – 2010-05-25 14:34:50

+0

是的 - 正如我所說我的功能並沒有真正的完整性檢查。我放入!$ end的唯一原因是參數列表中的空值。這實際上是lamda功能的絕佳位置! – 2010-05-25 16:44:07

1

你們都錯過了這樣一個事實,即4被添加到數組2的鍵值後面,而不是最後一個值。

這是我還包括有一個檢查,以確保所添加的關鍵確實存在,儘管這可能並不需要你所需要的代碼(經測試,與工作)

$array = array(0,1,3); 
$inc = 4; 
$end = end($array); 
$key = key($array); 
$final = 15; 

while ($end < $final) { 
    if ($array[$key-2] >= 0) { 
     $end = $array[$key-2] + $inc; 
     $array[] = $end; 
     $key++; 
    } 
} 

+0

看起來不錯,我現在就來測試吧! – Toby 2010-05-25 14:44:58

+0

適用於我,即使我更改$ inc和$ final – joebert 2010-05-25 16:11:10

0

這將是更好地瞭解你正在嘗試爲整體看起來過於複雜的可怕在這裏實現的,但是...

$array = array(0,1,3); 
$pattern = array(); 
$inc = 4; 
$final = 15; 

for ($base = 0; ; $base += $inc) { 
    foreach($array as $rem) { 
    if ($base + $rem > $final) break 2; 
    $pattern []= $base + $rem; 
    } 
} 

另外,

$i = $v = 0; 
while ($v < $final) { 
    $v = $pattern []= $pattern[$i++] + $inc; 
} 

(假設$final會成爲該模式的一部分。)

0

如果你能想出如何計算預先在數組中的元素數量並將其分配給$ tum,這個s會工作。

<?php 

$arr = array(0, 1, 3); 
$inc = 4; // 6 
$fin = 15; // 55 
$num = count($arr); 
$lum = 0; 
$tum = 12; // 29 

do 
{ 
    for($i = $lum; $i < $num; $i++) 
    { 
     $tar  = $arr[$i] + $inc; 
     $arr[$tar] = $tar; 
    } 
    $lum = $num; 
    $num *= 2; 
} while(end($arr) < $fin); 

$arr = array_slice($arr, 0, $tum); 

print_r($arr); 
echo "\n"; 

?>