2010-05-25 1 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

Я не понимаю, какой именно шаблон вам нужен, поскольку ваш примерный код не даст того же шаблона, что и в вашем списке, поэтому я ответил на ваш пример кода. Это верно? –

+1

Что произойдет, если вы пропустите номер, который хотите поразить? Программа останавливается с ошибкой или что? Пример: вы хотите остановиться на 14, но вы можете иметь только 13, а затем 15 ... –

+0

Извините, я написал код в спешке, но это конечный результат (список), который мне нужно, чтобы иметь возможность воссоздать , Проблема в том, что мне нужно добавить 4 к каждой части массива, а не только к последнему ее элементу. – Toby

ответ

0

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

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

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

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

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

Или с цикл:

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

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

Вы должны включить 15. Итак '$ end <= $ final' ** < = **. –

+1

SergeanT, 15 будет включен, потому что $ end только увеличивается в цикле. –

+0

Это не сработает, потому что первым результатом будет 7, а не 4 (0 + 4). – Toby

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)'. –

+0

Да - как я уже сказал, у моей функции действительно нет проверки целостности. Единственная причина, по которой я положил конец $ end, был из-за нулевого значения в списке параметров. Это действительно отличное место для функции лампы! –

1

Y'all не хватает того факта, что 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

+0

Работает для меня, даже когда я меняю $ inc и $ final – joebert

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

?> 
Смежные вопросы