2016-11-02 4 views
0

Мне нужен совет, как отображать данные из массива (результат запроса sql) в PHP.PHP, соединяющий строку из базы данных

Вот проблема:

problem

Мой результат запроса 2 ряд (верхний рисунок). В настоящее время я использую метод для отображения всех данных, таким образом, foreach будет перебирать 2 раза, не так ли?

Теперь, я хочу спросить: На моей веб-странице, как я могу отображать, как нижняя фигура?

Как присоединиться ко второй строке (оценка теории равна 0, а оценка лаборатории равна 75 и 80) в первую строку? Так что это будет только одна строка для ID 112.

EDIT:

Запрос SQL не моя часть. Я только что получил эти данные (верхний рисунок), и моя работа только для отображения его на веб-странице.

+0

Какой у вас текущий SQL? Вам нужно использовать 'SUM()' и 'GROUP BY' –

+0

@ ZamronyP.Juhara SQL-запрос не является моей частью. Я только что получил эти данные (верхний рисунок), и моя работа только для отображения его на веб-странице. – joshua14

+0

Покажите оба массива, на которых вы используете 'foreach', так как мы хотим видеть, как вы получаете данные из запроса? –

ответ

-1

Мне интересно, почему у вас есть две строки с одинаковым «id». Обычно «id» должен быть основным ключом ... В любом случае, вы могли бы просто комбинировать строки с одним и тем же «id», добавляя одинаково названные поля, отличая их целыми числами.

EDIT 1-2: Предположив код в ассоциативные массивы:

$rows = array(
    0 => array(
     'id' => 112, 
     'theory' => array('score1' => 70, 'score2' => 80), 
     'lab' => array('score1' => 0, 'score2' => 0) 
    ), 
    1 => array(
     'id' => 112, 
     'theory' => array('score1' => 0, 'score2' => 0), 
     'lab' => array('score1' => 75, 'score2' => 80) 
    ), 
    2 => array(
     'id' => 110, 
     'theory' => array('score1' => 0, 'score2' => 0), 
     'lab' => array('score1' => 75, 'score2' => 80) 
    ) 
); 
// New buffer for data 
$newArray = array(); 
// Loop to combine buffer 
foreach ($rows as $row) { 
    if (array_key_exists($row['id'], $newArray)) 
    { 
     $newArray[$row['id']]['theory']['score1'] += $row['theory']['score1']; 
     $newArray[$row['id']]['theory']['score2'] += $row['theory']['score2']; 
     $newArray[$row['id']]['lab']['score1'] += $row['lab']['score1']; 
     $newArray[$row['id']]['lab']['score2'] += $row['lab']['score2']; 
    } else { 
     $newArray[$row['id']]['theory']['score1'] = $row['theory']['score1']; 
     $newArray[$row['id']]['theory']['score2'] = $row['theory']['score2']; 
     $newArray[$row['id']]['lab']['score1'] = $row['lab']['score1']; 
     $newArray[$row['id']]['lab']['score2'] = $row['lab']['score2']; 
    } 
} 
// Loop to show data 
foreach ($newArray as $key => $value) { 
    echo $key." ".$value['theory']['score1']." ".$value['theory']['score2']." ".$value['lab']['score1']." ".$value['lab']['score2']."\n"; 
} 

Выход:

112 70 80 75 80 
110 0 0 75 80 
+0

Умм на самом деле есть другое поле, которое делает его двумя рядами, но я его не писал. И как «объединить строки с одинаковым« id »? ?? – joshua14

+0

Используйте цикл foreach для соединения данных в новом массиве и другой цикл foreach для отображения данных. – framontb

+0

Поместите var_dump ($ row), и код будет здесь в этом сообщении через 5 минут. – framontb

0

Ну как вы использовали для отображения строк с foreach вы могли бы сделать это таким же образом:

* create new array 
* loop through your current array 
* save to new array by ID and do SUMs 
* you can do output from newly created array. 
-1

Предположим, что вы получили данные а Массивы:

$data=array(); 
$data[0]=[112,70,80,0,0]; 
$data[1]=[112,0,0,75,80]; 
$data[2]=[113,71,81,0,0]; 
$data[3]=[113,0,0,76,81]; 

Если вы заранее знаете, что каждый идентификатор будет иметь ровно две записи:

echo '<table>'; 
echo '<thead>'; 
echo '<tr>'; 
echo '<th rowspan="2">ID</th><th colspan="2">theory</th><th colspan="2">lab</th>'; 
echo '</tr>'; 
echo '<tr>'; 
echo '<th>score1</th><th>score2</th><th>score1</th><th>score2</th>'; 
echo '</tr>'; 
echo '</thead>'; 
echo '<tbody>'; 
for($i=0;$i<count($data);$i++) 
{ 
    $d=$data[$i]; 
    echo '<tr>'; 
    echo '<td>'.$d[0].'</td>'; //ID 
    echo '<td>'.$d[1].'</td><td>'.$d[2].'</td>'; 
    $d=$data[++$i]; //take next element from array 
    echo '<td>'.$d[3].'</td><td>'.$d[4].'</td>'; 
    echo '</tr>'; 
} 
echo '</tbody>'; 
echo '</table>'; 

кодекса PHPfiddle.

Но, как правило, ваш SQL-запрос должен быть изменен, чтобы представлять сводные данные, и тогда у вас не будет этой проблемы. Однако вы подчеркнули, что это не в ваших силах.

+0

@ joshua14 этот код приводит к таблице точно так, как вы хотели, почему вы считаете, что это не полезно? Забери в скрипке и посмотри. – sbrbot

0
  • создать новый массив с помощью цикла через текущий массив, который будет отфильтровывать значения 0, вероятно, с помощью array_walk_recursive() или array_map() или array_filter()
  • то на данном этапе вы получили отфильтрованный массив
  • вы можете сделать вывод из отфильтрованного массива
Смежные вопросы