使用php和orderby将序列化数组保存到mysql

时间:2013-10-24 14:57:06

标签: javascript php mysql

这是javascript序列化数组:

[{"id":1},{"id":2},{"id":3,"children":[{"id":4,"children":[{"id":5},{"id":6},{"id":7}]},{"id":8}]}]

如何使用php将此(动态)保存到mysql:

***********************************
|  id  |   subsite_id  | orderby  |
   1           0            0
   2           0            1
   3           0            2
   4           3            0
   5           4            0
   6           4            1
   7           4            2
   8           3            1
***********************************

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

这可能不是最佳解决方案,但肯定是 解决方案。最近,我了解了RecursiveIterator和他们的堂兄RecursiveIteratorIterator。所以,我自己在我编码的所有内容中使用它们(相关的XKCD:https://xkcd.com/208/)。

我很快就把它搞砸了:

class ChildIDIterator implements RecursiveIterator{
    private $_array;
    private $_position = 0;
    private $_parent;

    public function __construct(array $array, $parent=0) {
        $this->_array = $array;
        $this->_parent = $parent;
    }

    function valid(){
        return isset($this->_array[$this->_position]);
    }

    function current() {
        return $this->_array[$this->_position]['id'];
    }

    function next() {
        $this->_position++;
    }

    function rewind() {
        $this->_position = 0;
    }

    function key() {
        return $this->_position;
    }

    function hasChildren(){
        return isset($this->_array[$this->_position]['children']);
    }

    function getChildren(){
        return new self(
            $this->_array[$this->_position]['children'],
            $this->_array[$this->_position]['id']
        );
    }

    function getParent(){
        return $this->_parent;
    }
}

这会递归遍历您的(已解码)数组并返回id值。要使用它,您可以这样做:

$json = '[{"id":1},{"id":2},{"id":3,"children":[{"id":4,"children":[{"id":5},{"id":6},{"id":7}]},{"id":8}]}]';

$array = json_decode($json, TRUE);

$iterate = new RecursiveIteratorIterator(new ChildIDIterator($array), RecursiveIteratorIterator::SELF_FIRST);

foreach($iterate as $order=>$id){
    echo "UPDATE sites SET subsite_id={$iterate->getParent()}, orderby={$order} WHERE id={$id};\n";
}

DEMO:https://eval.in/57189