PHP - шаблоны в массивах - PullRequest
0 голосов
/ 25 мая 2010

Я пытаюсь создать функцию, которая отображает повторяющийся шаблон целых чисел, используя массив.

Например, если у меня есть начальный массив (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);
}

Ответы [ 6 ]

1 голос
/ 25 мая 2010

У вас отсутствует тот факт, что 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++;
    }
}

Я также включил туда проверку, чтобы убедиться, что добавляемый ключ действительно существует, хотя это может и не понадобиться.

1 голос
/ 25 мая 2010
$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;
}
0 голосов
/ 25 мая 2010

Если вы можете заранее выяснить, как рассчитать количество элементов в массиве и назначить это значение $ tum, это должно сработать.

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

?>
0 голосов
/ 25 мая 2010

Было бы лучше узнать, чего вы пытаетесь достичь здесь, поскольку все это выглядит ужасно сложным, но ...

$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 голосов
/ 25 мая 2010

Я предполагаю, что вы хотите, чтобы все новые значения были в одном массиве. Итак:

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

этот код должен работать для любого начального значения в массиве, любого инкрементного значения и любого значения остановки.

0 голосов
/ 25 мая 2010
<?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
}

Это минус любой вид тестирования или проверки введенных значений, но вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...