2010-05-25 35 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"; 

?>