保存阵列位置

时间:2011-09-25 18:21:28

标签: php mysql arrays tree

我有树,用户可以拖放元素并更改元素位置。 每次更改后我都会发送这个序列化数组,我想保存它。

示例树:

Economics
Blogging
General Dev
Japan
Productivity

    Humanities
        Education
        Science
            Haskell
                Earth
            PHP

我正在通过ajax发送序列化树,所以我有数组linke。

'0' => "1"
'1' => "2"
'2' => "3"
'3' => "4"
'4' ...
    '0' => "5"
    '1' ...
        '0' ...
            '0' => "6"
            '1' ...
                '0' => "7"
                '1' ...
                    '0' => "8"
                    '1' ...
                        '0' ...
                            '0' => "9"
                            '1' ...
                                '0' => "10"
                        '1' ...
                            '0' => "11"

数组值是表行标识。

如何将此数组插入到具有正确位置的数据库中?

2 个答案:

答案 0 :(得分:1)

我建议使用传统的树存储方法:

create table catalogue (
    id int not null auto_increment primary key,
    name varchar(255),
    catalogue_id int,
    ord int
);

因此,首先需要正确填充db,然后休息应该很容易处理。

实际代码。

客户方:

   <ul id="enclosure_0" class="sortable">
        <li id="item_1">Level0 - Item 1</li>
        <li id="item_2">Level0 - Item 2</li>
        <li id="item_3">Level0 - Item 3</li>
        <li id="item_4">Level0 - Item 4</li>
        <li id="item_5">Level0 - Item 5
            <ul id="enclosure_5" class="sortable">
                <li id="item_6">Level1 - Item 1</li>
                <li id="item_7">Level1 - Item 2</li>
                <li id="item_8">Level1 - Item 3</li>
                <li id="item_9">Level1 - Item 4</li>
            </ul>
        </li>
   </ul>        
   <script>     
       $(document).ready(function(){
           $(".sortable").sortable({
               stop: function(ev, ui){
                   var list = $(this).sortable("toArray");
                   $.get("sort.php", {items: list, parent_id: $(this).attr('id')}, function(data){window.alert("stored");}); 
                }
            });
        });
    </script>

服务器端(sort.php):

<?php

/* you have new order in $_GET["items"], you have parent id in $_GET["parent_id"] */

/* easiest way:
 * */

preg_match("/enclosure_([0-9])+/", $_GET["parent_id"], $tmp);
$parent_id = (int) $tmp[1];
$counter = 0;
foreach ($_GET["items"] as $item){
    $counter++;
    preg_match("/item_([0-9]+)/", $item, $tmp);
    $item_id = (int) $tmp[1];
    $db->query("update catalogue set ord = $counter where id = $item_id");
    /* alternatively, somewhat safer */
    $db->query("update catalogue set ord = $counter where id = $item_id and catalogue_id = $parent_id");
} 

注释和假设:

1)对于顶级类别,catalogue_id应为0 2)我相信你足够聪明,可以动态渲染客户端。 3)假设ord是1。 4)php未经测试,但应该没问题

答案 1 :(得分:0)

我不会尝试以正确的顺序保存数据库表中的行,我会在表中添加“位置”列。我假设您已经有一个“父”列来保持层次结构。

当用户重新排列项目时,只需更新位置列。