Ten problem to czysta matematyka. Możesz poszukać gotowej funkcji, a jeśli masz ochotę zrobić swoją, to masz pole do popisu. Idealnie byłoby, gdyby funkcja przyjmowała dowolną liczbę kolorów w gradiencie. Idealnie byłoby zrobić to obiektowo, żeby wywoływane było to np. tak:
$gradient = new Gradient();
$gradient->addColor(new Color(0, 255, 0), 0);
$gradient->addColor(new Color(255, 255, 0), 0.5);
$gradient->addColor(new Color(255, 0, 0), 1);
var_dump($gradient->getColor(0
.25
)); // zwróciłoby obiekt klasy Color będący kolorem pośrednim między zielonym a żółtym
Można to też uprościć (chociaż już nie będzie tak elegancko) i stworzyć po prostu funkcję. Jeśli miałaby mieć tę samą funkcjonalność, musiałaby przyjmować kolory w tablicy lub jako zmienną liczbę parametrów, a pierwszym (lub ostatnim) parametrem byłaby pozycja pożądanego koloru (najlepiej w skali <0;1>). Wtedy do ustalenia byłby sposób podawania i zwracania kolorów, np. tablica array('r' => ..., 'g' => ..., 'b' => ...) lub szesnastkowo.