2016-08-15 81 views
0

我現在有一個看起來像這樣的UL名單:PHP排序DOM元素和替換

<ul id="primary-nav"> 
    <li class="navButton" id="amps_off_button" data-order="6"> 
     <span class="navButton-color red"><p>AMPS Off</p></span> 
     <span class="glare"></span> 
    </li> 
    <li class="navButton" id="amps_alarms" data-order="7"> 
     <span class="navButton-color"><p>AMPS Alarms</p></span> 
     <span class="glare"></span> 
    </li> 
    <li class="navButton" id="sysConfig" data-order="3"> 
     <span class="navButton-color"><p>System Configuration</p></span> 
     <span class="glare"></span></li> 
    <li class="navButton" id="system" data-order="4"> 
     <span class="navButton-color"><p>System</p></span> 
     <span class="glare"></span> 
    </li> 
    <li class="navButton" id="backBtn" data-order="100"> 
     <span class="navButton-color"><p>BACK</p></span> 
     <span class="glare"></span> 
    </li> 
    <li class="navButton" id="rescan" data-order="101"> 
     <span class="navButton-color"><p>ReScan</p></span> 
     <span class="glare"></span> 
    </li> 
</ul> 

在我的導航類的,我有一個可以調用的函數將被排序的無序列表的順序數據順序中的值:

public function setOrder() { 
    $liNodeList = $this->xpath->query("//ul[@id='primary-nav']//li"); 
    $liNodes = iterator_to_array($liNodeList); 

    usort($liNodes, array('Navigation', 'sortListByOrderAttr')); 

    if ($liNodeList->length == count($liNodes)) { 
     for ($i = 0; $i < $liNodeList->length; $i++) { 
      $node = $liNodeList->item($i); 
      $newNode = $liNodes[$i]; 
      $node->parentNode->replaceChild($newNode, $node); 
     } 
    } 
    else echo "error"; 
} 

private static function sortListByOrderAttr($a, $b) { 
    return (int) $a->getAttribute('data-order') - (int) $b->getAttribute('data-order'); 
} 

由於某些原因,我沒有得到正確的列表順序。相反,輸出顯示4項,而不是6個項目它應該顯示:

<ul id="primary-nav"> 
    <li class="navButton" id="amps_off_button" data-order="6"> 
     <span class="navButton-color red"><p>AMPS Off</p></span> 
     <span class="glare"></span> 
    </li> 
    <li class="navButton" id="amps_alarms" data-order="7"> 
     <span class="navButton-color"><p>AMPS Alarms</p></span> 
     <span class="glare"></span> 
    </li> 
    <li class="navButton" id="backBtn" data-order="100"> 
     <span class="navButton-color"><p>BACK</p></span> 
     <span class="glare"></span> 
    </li> 
    <li class="navButton" id="rescan" data-order="101"> 
     <span class="navButton-color"><p>ReScan</p></span> 
     <span class="glare"></span> 
    </li> 
</ul> 

這裏我懷疑我的問題是,我$node->parentNode->replaceChild($newNode, $node);沒有ES布埃諾。也許我需要一個不同的方法來排序呢?幫助讚賞!

+0

你覺得呢'replaceChild'呢? – cHao

+0

不知道你是諷刺還是真實。 – JayZiggaZeus

+0

我真實。那麼,Socratically真實。 – cHao

回答

0

那麼,考慮cHao的說法後,看起來在重新閱讀replaceChild的工作方式後,它解釋了爲什麼我的方法沒有產生正確的結果,這是由於新的子節點已經存在於節點集中。

我固定的代碼,例如:

public function setOrder() { 
    $liNodeList = $this->xpath->query("//ul[@id='primary-nav']//li"); 
    $liNodes = iterator_to_array($liNodeList); 

    usort($liNodes, array('Navigation', 'sortListByOrderAttr')); 

    if ($liNodeList->length == count($liNodes)) { 
     for ($i = 0; $i < $liNodeList->length; $i++) { 
      $node = $liNodeList->item($i); 
      $newNode = $this->doc->importNode($liNodes[$i], TRUE); 
      $node->parentNode->appendChild($newNode); 
     } 
    } 
    else echo "error with nav menu"; 
}