In de kern voelt dit als een databaseprobleem.
Stel de procentkolom in als NIET NULL en stel 0 in als STANDAARD.
ALTER TABLE promotions CHANGE COLUMN percent [maintain-its-type] NOT NULL DEFAULT '0';
Dan is het een kwestie van (als ik het probleem begrijp) de MAX() en MIN() procentwaarden voor elke datum te plukken.
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;
...Ik heb dat niet getest, dus het kan wat gepruts nodig hebben.
Terwijl u door uw resultatenset bladert, kunt u de twee afzonderlijke subarrays declareren en uw volledige array samenstellen.
$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;
}
Op dit punt heb ik te veel veronderstellingen gemaakt over uw doel / gebruik. Stel in principe nul in als het standaardpercentage, zoek naar het hoogste en laagste percentage voor elk datum-snelheidspaar (als nul, dan verschijnt nul als hoogste en laagste waarde). Doe wat je wilt met de resultatenset.