Результат запроса:
+--------+-----------+--------------+-----------+
| rol_id | pos_name | role_name | sys_name |
+--------+-----------+--------------+-----------+
| 2 | A Manager | Role A | System A |
| 1 | A Manager | Role B | System A |
| 105 | A Manager | Role A | System B |
| 106 | A Manager | Role B | System B |
| 107 | A Manager | Role C | System B |
| 108 | A Manager | Role D | System B |
| 4 | A Manager | Role A | System C |
| 25 | A Manager | Role A | System C |
| 100 | A Manager | Role A | System C |
Требуемый вывод:
Имя должности «Менеджер» может получить доступ
- "Система А"
- "Система B"
- "Роль А"
- "Роль B"
- "Роль С"
- "Роль D"
и т.д.
Текущий код, использующий цикл for
для захвата системных имен:
$posname = mysqli_fetch_array($posresult);
echo $posname['pos_name']. '<br/>';
echo 'A total of ' .$result->num_rows. ' rows were returned<br/>';
$numResults = $result->num_rows;
$all_results = array();
while ($row = mysqli_fetch_assoc($result)) {
// Append all rows to an array
$all_results[] = $row;
}
for($i = 0; $i < $numResults; $i++){
echo $all_results[$i]["sys_name"];
echo '<br/>';
}
Далее я собирался изучить вложенные циклы, чтобы распределить роли в каждой системе.
Но выше приведен список каждой системы для каждой строки в массиве (ожидаемое поведение с текущим кодом), как я могу сгруппировать вывод, чтобы он выглядел, как указано выше, с каждой системой, перечисленной один раз, и каждой связанной с ней ролью, напечатанной под ней
EDIT
Я думал, что делал успехи, но теперь получаю все роли в каждой системе: -
$posname = mysqli_fetch_array($posresult);
echo $posname['pos_name']. '<br/>';
echo 'A total of ' .$result->num_rows. ' rows were returned<br/><br/>';
$numResults = $result->num_rows;
$all_results = array();
while ($row = mysqli_fetch_assoc($result)) {
// Append all rows to an array
$all_results[] = $row;
}
$j = 0;
while ($j < $numResults) {
$sysName = $all_results[$j]["sys_name"];
echo $sysName;
echo '<br/>';
for($i = 0; $i < $numResults; $i++){
if ($all_results[$i]["sys_name"] = $all_results[$j]["sys_name"]){
echo $all_results[$i]["role_name"];
echo '<br/>';
}
}
echo '<br/><hr/>';
$j++;
РЕДАКТИРОВАТЬ: переменная мощность. Система одинакова в каждой строке, что странно, потому что это не так, если вы запускаете запрос в MySQL?
array
(0 =>array
('rol_id' => '2','pos_name' => 'Manager A','role_name' => 'Role A','sys_name' => 'System A',),
1 =>array
('rol_id' => '1','pos_name' => 'Manager A','role_name' => 'Role B','sys_name' => 'System A',),
2 =>array
('rol_id' => '105','pos_name' => 'Manager A','role_name' => 'Role A','sys_name' => 'System A',),
3 =>array
('rol_id' => '106','pos_name' => 'Manager A','role_name' => 'Role B','sys_name' => 'System A',),
4 =>array
('rol_id' => '107','pos_name' => 'Manager A','role_name' => 'Role C','sys_name' => 'System A',),
РЕДАКТИРОВАТЬ 2: Если я возьму var_export после установки массива, системы верны. Выше, если я var_export после циклов в нижней части кода
РЕДАКТИРОВАТЬ 3: Так что я использовал = вместо == в моем заявлении IF! Я не совсем там, но результат выглядит намного лучше. Обновлюсь, когда я отработаю последнюю часть. Спасибо за комментарий ниже
EDIT FINAL: ниже дано то, что я хочу, теперь я вижу, что @ADyson говорил ниже о сравнении последней строки с текущей. Я использовал $ control для этого. Пришлось поиграть с тем, где его увеличить, но теперь это работает. Спасибо всем
$all_results = array();
while ($row = mysqli_fetch_assoc($result)) {
// Append all rows to an array
$all_results[] = $row;
}
//var_export($all_results);
$j = 0;
$control = $j;
//$all_results[$row['sys_name']][] = $row;
while ($j < $numResults) {
if ($control == $j){
echo 'System Name: ' . $all_results[$j]["sys_name"];
echo '<br/>';
for($i = 0; $i < $numResults; $i++){
if ($all_results[$i]["sys_name"] == $all_results[$j]["sys_name"]){
echo 'Role: ' . $all_results[$i]["role_name"];
echo '<br/>';
$control++;
}
}
echo '<br/>';
}
$j++;
}