Вычисление новых значений массива на основе другого числового массива

У меня есть массив (заполненный из базы данных) $dna_segment_length , в этом случае:

 {50, 75, 20, 90} 

Каждое значение представляет длину строки. Линии рисуются на холсте наподобие:

введите описание изображения здесь

Чтобы линейные сегменты включались в непрерывную горизонтальную линию, мне нужно создать другой массив, например $start_points , который представляет начальные точки для каждой строки. В приведенном выше примере этот массив будет выглядеть следующим образом с заданной начальной точкой для первой строки:

 {100, 150, 225, 245} 

Первое значение в массиве начальных точек всегда должно быть 100. Последовательные значения создаются путем добавления длины строки и предыдущего значения в новом массиве. Вопрос в том, как мне это сделать, используя цикл?

 //The first value in the starting points array always needs to be 100 $firstValue = 100; $start_points = array(); $currentValue = $firstValue; $dnaSegmentLengthCount = count($dna_segment_length); //using a loop for ($i = 0; $i < $dnaSegmentLengthCount; ++$i) { $start_points[$i] = $currentValue; //created by adding the line length and the previous value in the new array $currentValue += $dna_segment_length[$i]; } 

Я думаю, это

прекрасная возможность

для использования array_map :

 <?php $seg = array(50, 75, 20, 90); $start = 100; // offset $pts = array_map(function($n) use (&$start) { $val = $start; $start += $n; return $val; },$seg); print_r($pts); ?> 

print_r обеспечивает

выходы,

сотой смещения:

 Array ( [0] => 100 [1] => 150 [2] => 225 [3] => 245 ) 

Это поэзия

и кодовое искусство для чьих-то глаз

используя array_map .

Я решил, что один массив с несколькими измерениями должен быть проще, чем пытаться ссылаться на 2 массива позже. Это также позволит вам ссылаться на длину последнего элемента массива длины из одного массива 🙂

 // $dna_segment_length = {50, 75, 20, 90} $starting_int = 100; // the starting value for the line distance $prev_val = 0; // initialised and set to 0 so we dont effect $starting_int $segment_array = array(); // will be our reference multi dimension array for($x = 0; $x < count($dna_segment_length); $x++){ $segment = array(); // local array $segment["start"] = $starting_int + $prev_val; $segment["length"] = $dna_segment_length[$x]; array_push($segment_array, $segment); //set values for next iteration $starting_int .= $prev_val; $prev_val = $dna_segment_length[$x]; } // output array /* { [0]=> array( ["start"] => 100, ["length"] => 50 ), [1]=> array( ["start"] => 150, ["length"] => 75 ), [2]=> array( ["start"] => 225, ["length"] => 20 ), [3]=> array( ["start"] => 245, ["length"] => 90 ), } */