JQuery Select2 - форматирование вложенного списка из результатов PHP / MySQL - PullRequest
0 голосов
/ 15 октября 2019

У меня есть список Select2 , который я хочу заполнить вложенной структурой для данных:

Level 1
  Condition 1
  Condition 2
Level 2
  Condition 3
  Condition 4
etc

JSON должен иметь следующий формат:

data: [{
        'text': 'Level 1',
        'children': [{
            'id': 1,
            'text': 'Condition 1'
        }, {
            'id': 2,
            'text': 'Condition 2'
        }, ],
        'text': 'Level 2',
        'children': [{
            'id': 3,
            'text': 'Condition 3'
        }, {
            'id': 4,
            'text': 'Condition 4'
        }, ]
    }]

JQuery Select2:

$.ajax( {
                url: "scripts/get_conditions.php",
                dataType: 'json'
            } ).then( function ( response ) {
                $( "#condition_tree" ).select2( {
                    placeholder: "Select a Condition...",
                    allowClear: true,
                    width: 'resolve',
                    containerCssClass: "show-hide",
                    data: response
                } );
            } );

В настоящее время используются следующие PHP и MySQL, которые я не уверен, как изменить для получения требуемых результатов:

$query = 'SELECT * FROM mcondition ORDER BY mcondition_name ASC';
$result = $connection->query( $query );

$presentations = array();

while ($row = mysqli_fetch_array($result)) {
$mconditions[] = array("id"=>$row['mcondition_pk'], "text"=>$row['mcondition_name']);
}
echo json_encode($mconditions);
?>

ИТаблица условий:

+---------+-----------+------------------------------+
| mcondition_pk | mcondition_name | mcondition_level |
+---------+-----------+------------------------------+
| 1             | Condition 1     | Level 1          |
+---------+-----------+------------------------------+
| 2             | Condition 2     | Level 1          |
+---------+-----------+------------------------------+
| 3             | Condition 3     | Level 2          |
+---------+-----------+------------------------------+
| 4             | Condition 4     | Level 2          |
+---------+-----------+------------------------------+

Примечание. Версия PHP - 5.3.3, в настоящее время нет шансов на обновление.

1 Ответ

1 голос
/ 15 октября 2019

Используйте имя уровня в качестве ключа двумерного массива для сбора данных, добавьте данные каждой строки к дочерним элементам под соответствующим ключом.

// fake mysql row data
$data = [
  ['mcondition_pk' => 1, 'mcondition_name' => 'Condition 1', 'mcondition_level' => 'Level 1'],
  ['mcondition_pk' => 2, 'mcondition_name' => 'Condition 2', 'mcondition_level' => 'Level 1'],
  ['mcondition_pk' => 3, 'mcondition_name' => 'Condition 3', 'mcondition_level' => 'Level 2'],
  ['mcondition_pk' => 4, 'mcondition_name' => 'Condition 4', 'mcondition_level' => 'Level 2'],
];

$temp = [];

// foreach loop over fake data, replace that with your original `while(…)` again
foreach($data as $row) {
  $temp[$row['mcondition_level']]['text'] = $row['mcondition_level'];
  $temp[$row['mcondition_level']]['children'][] = [
    'id' => $row['mcondition_pk'],
    'text' => $row['mcondition_name']
  ];
}

// replace the associative keys with simple numeric ones again
$temp = array_values($temp);

echo json_encode($temp);
...