Построение массива для набора данных - разные стартовые баллы?

76
6

У меня есть набор значений, например:

$array[0]['Year', 'Value']

Если в главном массиве имеется около 100 массивов, каждая из которых содержит 30 пар значений "Год" и "Значение". Это отлично работает для всех моих текущих приложений, пока я не столкнулся с различными библиотеками графиков, которые хотят, чтобы их данные форматировались следующим образом:

[x1, y1, y2, y3 ...], [x2, y1, y2, y3 ...], ...

Это было бы легко, если бы все мои данные были начаты с того же года, но они этого не делают. Мои массивы начинаются в разные годы и перекрываются. Проблема заключается в том, что для формата графических библиотек требуется значение "null" в качестве метки места для этой конкретной серии, если для этой точки X нет значения оси Y.

Пример: My $ array [0] - с 1900 по 1930 год, мой массив $ [1] - с 1901 по 31 год. Итак, новый массив должен быть [1900, $ array [0] ['Value']], null] (чтобы указать, что массив $ array [1] не имеет там значения, но все еще является серией на Затем [1901, $ array [0] ['Value'], $ array [1] ['Value']] и т.д. и т.д.

Я рисую диаграммы и пытаюсь обернуть голову вокруг создания серии циклов, чтобы взять мой старый массив и преобразовать его... но я в недоумении. Есть идеи?

спросил(а) 2021-01-25T17:24:54+03:00 4 месяца, 2 недели назад
1
Решение
99

Прежде всего вам нужно определить ваши точки y, для этого нам нужен диапазон. Когда вы создаете свой массив, я бы имел две переменные: $minYear и $maxYear, затем для каждой записи в массиве вы проверяете, меньше ли она minYear или больше maxYear, и если это так, замените значение на это.

Это дает нам мин и макс, теперь нам нужен диапазон. Вам нужно определить, сколько очков за каждый год у вас есть. Чтобы все было просто, я собираюсь предположить, что 1 год - это одно приращение на оси y. Однако, если у вас есть максимальное количество точек на оси y, которые вы можете использовать, вы можете использовать следующие формулы, чтобы определить, сколько лет между каждой точкой:

$increment = ($maxYear - $minYear) / $numPointsOnYAxis;

Это даст вам, сколько лет между каждой точкой оси Y. Для простоты вы можете округлить это число, используя функцию ceil(). Это означает, что вы не будете использовать каждую точку на оси Y, но она сохраняет математику приятным и легким.

Теперь у нас есть диапазон, который вы можете использовать foreach loop для прохождения ваших данных и построения графика.

$space = '';
foreach($array as $num => $a) {
echo $space . '[x' . $num;
foreach($a as $year => $value) {
$y = ceil(($value - $minValue) / $increment); //Work out how many increments up the scale the year needs to be.
echo ', y' . $y;
}
echo ']';
$space = ', ';
}

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

ответил(а) 2021-01-25T17:24:54+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема