2013-10-24 68 views
0

的mysql這是JavaScript的序列化數組:序列化數組保存到PHP和排序依據

[{"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 
*********************************** 

謝謝回答。

+2

你知不知道如何反序列化呢?你知道如何編寫一個循環嗎?你知道如何進行查詢嗎? – Ryan

+0

該JSON如何對應該表?你怎麼知道在每個領域放什麼? –

+0

@RocketHazmat:'children'中的東西被放入與其父對應的'subsite_id'中,並且所有東西都被放入'orderby'中,以依賴它在包含它的數組中的位置。 – Ryan

回答

1

這可能不是最好的解決方案,但它肯定是a的解決方案。最近,我瞭解到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

+0

謝謝!這項工作很完美! –

+0

不客氣!很高興我能幫忙:-D –