I sin kerne føles dette som et databaseproblem.
Indstil procentkolonnen som NOT NULL og indstil 0 som STANDARD.
ALTER TABLE promotions CHANGE COLUMN percent [maintain-its-type] NOT NULL DEFAULT '0';
Så er det et spørgsmål om (hvis jeg forstår problemet) at plukke MAX() og MIN() procentværdierne for hver dato.
SELECT s.date, s.rate, MAX(p.percent) AS maxperc, MIN(p.percent) AS minperc
FROM stock s
LEFT JOIN promotions p ON s.date = p.date
WHERE s.date BETWEEN '2017-01-29' AND '2017-01-31'
GROUP BY s.date,s.rate;
...det har jeg ikke testet, så det kan godt være, at det skal pusle med.
Når du derefter går gennem dit resultatsæt, kan du erklære de to separate underarrays og bygge dit komplette array.
$array=[];
$i=0;
while($row=mysqli_fetch_assoc($result)){
$array[0][$i]["date"]=$row["date"];
$array[0][$i]["rate"]=$row["rate"];
$array[0][$i]["perc"]=$row["minperc"];
$array[1][$i]["date"]=$row["date"];
$array[1][$i]["rate"]=$row["rate"];
$array[1][$i]["perc"]=$row["maxperc"];
++$i;
}
På dette tidspunkt har jeg lavet for mange antagelser om dit formål/brug. Grundlæggende skal du angive nul som procentstandard, forespørg efter højeste og laveste procent for hvert dato-rate-par (hvis nul, vil nul vises som højeste og laveste værdi). Gør hvad du vil med resultatsættet.