【问题标题】:JQuery Select2 - Format nested list from PHP/MySQL resultsJQuery Select2 - 从 PHP/MySQL 结果格式化嵌套列表
【发布时间】:2019-10-15 09:13:18
【问题描述】:

我有一个 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 表:

+---------+-----------+------------------------------+
| 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,目前没有升级机会。

【问题讨论】:

  • 您不能直接使用查询来执行此操作。您必须使用循环从结果中获取值,然后检查级别并在该循环中相应地将它们推送到该键中。

标签: php mysql jquery-select2


【解决方案1】:

使用级别名称作为二维数组的键来收集您的数据,将每一行的数据添加到相应键下的子级。

// 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);

【讨论】:

  • @IlludiumPu36 好吧,那么您首先应该去接受网络服务器的安全噩梦,以免有人受伤……然后需要重写与数组相关的东西,[] 需要要成为array(),需要对$foo[] = 进行赋值调用array_push,并且需要显式创建children 子数组……3v4l.org/Vv9af
  • 同意!请注意升级....感谢您的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2014-12-28
  • 1970-01-01
  • 2013-10-31
  • 2012-02-12
  • 2018-02-19
相关资源
最近更新 更多