Почему PHP производит искаженный HTML для моего кода таблицы? - PullRequest
0 голосов
/ 27 марта 2020

Я создал функцию тепловой карты, которую я собираюсь использовать для заполнения ячеек таблицы в html, используя PHP 7.2.

Вот моя функция:

function bg($latency) {
    if ($latency ==0) {echo '#11FFFF';} 
    elseif ($latency <30) {echo '#22FFFF';} 
    elseif ($latency <60) {echo '#33FFFF';} 
    elseif ($latency <90) {echo '#44FFFF';} 
    elseif ($latency <120) {echo '#55FFFF';} 
    elseif ($latency <150) {echo '#66FFFF';} 
    elseif ($latency <180) {echo '#77FFFF';} 
    elseif ($latency <210) {echo '#88FFFF';} 
    elseif ($latency <240) {echo '#99FFFF';} 
    elseif ($latency <270) {echo '#AAFFFF';} 
    elseif ($latency <300) {echo '#BBFFFF';} 
    elseif ($latency >=300) {echo '#CCB27F';} 
}

Я извлекаю значения из таблицы MySQL с помощью простого оператора select, а затем пытаюсь построить таблицу со следующим фрагментом кода:

while($row = mysqli_fetch_assoc($result)) {
    echo '<tr><td>'.$row['origin'].'</td><td bgcolor='.bg($row['lt01']).'>'.$row['lt01'].'</td></tr>';
}

Но по какой-то причине выходные данные искажаются выходными данными функции появляясь перед HTML источником:

#11FFFF<tr><td>LT01</td><td bgcolor=>0</td></tr>
#22FFFF<tr><td>LT02</td><td bgcolor=>11</td></tr>
#44FFFF<tr><td>LT03</td><td bgcolor=>62</td></tr>
#44FFFF<tr><td>LT04</td><td bgcolor=>74</td></tr>
#99FFFF<tr><td>LT05</td><td bgcolor=>214</td></tr>

Я не могу за всю жизнь понять это.

1 Ответ

2 голосов
/ 27 марта 2020

Это потому, что ваша функция bg выводит код цвета на экран, а не возвращает его для использования другим кодом PHP. Измените функцию, чтобы использовать return вместо echo, и она будет работать должным образом.

function bg($latency) {
    if ($latency == 0)       {return '#11FFFF';} 
    elseif ($latency < 30)   {return '#22FFFF';} 
    elseif ($latency < 60)   {return '#33FFFF';} 
    elseif ($latency < 90)   {return '#44FFFF';} 
    elseif ($latency < 120)  {return '#55FFFF';} 
    elseif ($latency < 150)  {return '#66FFFF';} 
    elseif ($latency < 180)  {return '#77FFFF';} 
    elseif ($latency < 210)  {return '#88FFFF';} 
    elseif ($latency < 240)  {return '#99FFFF';} 
    elseif ($latency < 270)  {return '#AAFFFF';} 
    elseif ($latency < 300)  {return '#BBFFFF';} 
    elseif ($latency >= 300) {return '#CCB27F';} 
}

echo используется, когда вы хотите отобразить контент на экране прямо сейчас. Из-за того, как работает синтаксический анализатор PHP, echo в функции bg будет выполняться до echo, вызвавшего функцию, поскольку родительский элемент echo еще не завершил sh. Вот тут-то и приходит return. Вместо того, чтобы прямо сейчас печатать контент на экране, он передает его обратно в любую вызываемую функцию, которая будет использоваться любым способом, которым вы будете sh.

Более подробно объяснение эхо против возврата можно найти в этом посте: В чем разница между PHP эхо и PHP возвратом в простом английском языке sh?

...