tags:

views:

75

answers:

6

I am trying to create a function which maps a recurring pattern of integers using an array.

As an example if I have a starting array of (0,1,3) and I know that I want to stop the pattern when I hit 15.

The pattern gets incremented by a fixed integer each time (lets say 4) so my final pattern should be..

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)

Does anyone have any pointers on how this can be achieved?

My current implementation works but is stupidly inefficient which something like this...

$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);
}
+1  A: 
$array = array(0,1,3);
$inc = 4;
$final = 15;
$end = end($array);

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

Or with a for loop:

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

for($i = end($array) + $inc; $i <= $final; $i += $inc)
{
  $array[] = $i;
}
Emil Vikström
You have to include 15. So `$end <= $final` **<=** sign should be used.
SergeanT
SergeanT, 15 will be included because $end is only incremented inside the loop.
Emil Vikström
This wouldn't work because the first result would be 7, not 4 (0+4).
Toby
A: 
<?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
}

This is minus any sort of testing or checking of injected values but you get the idea.

Jarrod
They might pass in `$end = 0`. You might want to check `isset($end)` before setting it instead of `(!$end)`.
Marcus Adams
Yes - as I said my function didn't really have any integrity checking. The only reason I put in the !$end was because of the null value in the parameter list. This is actually an excellent location for a lamda function!
Jarrod
+1  A: 

Y'all are missing the fact that 4 is being added to the value in the array 2 keys back, not the last value.

This is the code you need (tested, and working)

$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++;
    }
}

I also included in there a check to make sure the key being added to actually exists, though that may not be needed.

Joseph
Looks good cheers, I will test it now!
Toby
Works for me, even when I change $inc and $final
joebert
A: 

I assume that you want to have all the new values in the same array. So:

//original array
$values =  array(0, 1, 3);

//incremental value
$inc = 4;
//stop value
$stop = 15;

//set the index counter to the origin
$curr_index = 0;

//while the last value of the array is lower than the stop value
while($values[end($values)] < $stop)
{
    //calculate the new value
    $new_value = $values[$curr_index] + $inc;
    //add the new value to the array
    array_push($values, $new_value);
    //update the index counter
    $curr_index ++;
}

this code should work for any initial value in the array, any incremental value and any stop value.

Giovanni Di Milia
A: 

It would be better to know what you are trying to achieve here as the whole thing looks horribly overcomplicated, but...

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

Alternatively,

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

(This assumes $final will be part of the pattern.)

Tgr
A: 

If you can figure out how to calculate the number of elements will be in the array beforehand and assign that to $tum this should work.

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

?>
joebert