2014-12-23 26 views
0

我正在解析文檔上的DOMDocument,該文檔將具有我感興趣的h3li標記的可預測結構。目前我正在使用這個功能。從DOMDocument在PHP中填充多維數組

function showDOMNode(DOMNode $domNode) { 
    foreach ($domNode->childNodes as $node) 
    { 
      $myName = preg_replace('/(\s)+/', ' ', $node->nodeName); 
      $myValue = preg_replace('/(\s)+/', ' ', $node->nodeValue); 
      if ($myName=="h3" or $myName=="li"){ 
       $myText = $myName.":".$myValue; 
       print $myText; 
       echo"\n"; 
      } 
     if($node->hasChildNodes()) { 
      showDOMNode($node); 
     } 
    } 
} 

其中給出的

h3:Category1 
li: Apple 
li: Banana 
h3:Category2 
li: Ant 
h3:Category3 
li: Alaska 
h3:Category4 
li: Albania 
li: Bahamas 

漂亮的輸出,但想以某種方式把這個變成一個多維數組。 $myArray[][]其中第一維是h3值和li值被放置在適當的h3陣列中。

function showDOMNode(DOMNode $domNode, $arrayToFill) { 
    foreach ($domNode->childNodes as $node) 
    { 
      $myName = preg_replace('/(\s)+/', ' ', $node->nodeName); 
      $myValue = preg_replace('/(\s)+/', ' ', $node->nodeValue); 
      if ($myName=="h3" or $myName=="li"){ 
       //somehow insert $myValue into $arrayToFill maybe??? 
      } 
     if($node->hasChildNodes()) { 
      showDOMNode($node,$arrayToFill); 
     } 
    } 
    return $arrayToFill; 
} 

或者如果有更簡單的方法來做到這一切,我對任何事情都是開放的。數據結構將始終有li標籤以h3標籤分隔。

回答

1

使用此爲somehow insert $myValue代碼:

if ($myName == "h3") { 
    if (!isset($arrayToFill[$myValue])) { 
     $arrayToFill[$myValue] = array(); 
    } 
    $curElement = $myValue; 
} elseif ($myName == "li") { 
    $arrayToFill[$curElement][] = $myValue; 
} 

這應返回類似於數組:

[ "Category1" => [ "Apple", "Banana" ], 
    "Category2" => [ "Ant" ], 
    "Category3" => [ "Alaska" ], 
    "Category4" => [ "Albania", "Bahamas" ] 
] 

此外,當您執行遞歸調用,你不拿起返回數組:

$arrayToFill = showDOMNode($node, $arrayToFill); 

你也可以通過將$arrayToFill作爲參考:

function showDOMNode(DOMNode $domNode, &$arrayToFill) { 

然後在調用者中可以看到函數中數組的修改。

我們還需要將$curElement傳遞給遞歸調用。我也將其作爲參考傳遞給它,以便對它的更新將反映在調用者中。

function showDOMNode(DOMNode $domNode, &$arrayToFill, &$curElement = null) { 
    foreach ($domNode->childNodes as $node) 
    { 
      $myName = preg_replace('/(\s)+/', ' ', $node->nodeName); 
      $myValue = preg_replace('/(\s)+/', ' ', $node->nodeValue); 
      if ($myName == "h3") { 
       if (!isset($arrayToFill[$myValue])) { 
        $arrayToFill[$myValue] = array(); 
       } 
       $curElement = $myValue; 
      } elseif ($myName == "li") { 
       $arrayToFill[$curElement][] = $myValue; 
      } 
     if($node->hasChildNodes()) { 
      showDOMNode($node, $arrayToFill, $curElement); 
     } 
    } 
    return $arrayToFill; 
} 
+0

這完美地創建第一水平,但代替,比方說,'[「蘋果」,「香蕉」]'它只是返回一個空數組,'=>數組()'用於第二級別的項目。 – turkeyhundt

+0

我把一個echo聲明,所以它肯定迭代通過這些'li'項目,但只是沒有把它們存儲在任何地方... – turkeyhundt

+0

好吧,我用'$ arrayToFill = showDOMNode替換'showDOMNode($ node,$ arrayToFill);'' ($ node,$ arrayToFill);'並且它返回了同一個空的第一級數組的數組,除了數組中的第二個元素是一個未命名的數組並且每個'li'項在同一個數組中。參考數組參數做同樣的事情。讓我確定我正在做你說的話。這是我得到的。 Array([Category1] => Array(), [] => Array(Apple,Banana,Ant,Alaska,Albania,Bahamas), [Category2] => Array(), [Category3] => Array ), [Category4] => Array() )' – turkeyhundt