2011-07-29 109 views
0

所以我想編寫一個函數,執行以下操作:我有大約20個左右的XML文件(有一天,我將有超過一百個),並在每個文件的標題是名一位同行評審編輯<editor role="PeerReviewEditor">John Doe</editor>。我想運行存儲這些文件的目錄,並捕獲該文件的Peer-Review-Editor的名稱。我想結束包含所有不同名稱的變量$reviewEditorNames。 (我會再使用它來顯示編輯列表等)PHP - 結合陣列

這裏就是我這麼遠。我擔心最後一部分。我覺得嘗試把$editorReviewName$editorReviewNames是不會給個人結合起來,每一個文件,而是一個給定的文件中找到(即使只有一個在給定文件名稱的數組,因此它是1的陣列)

我對你的幫助表示感謝。

function editorlist() 
{ 
    $filename = readDirectory('../editedtranscriptions'); 
    foreach($filename as $file) 
    { 
     $xmldoc = simplexml_load_file("../editedtranscriptions/$file"); 
     $xmldoc->registerXPathNamespace("tei", "http://www.tei-c.org/ns/1.0"); 
     $reviewEditorName = $xmldoc->xpath("//tei:editor[@role='PeerReviewEditor']"); 

     return $reviewEditorNames[] = $reviewEditorName; 
    } 


} 
+1

建立在foreach循環的陣列,在foreach後返回。另外...在循環之前製作一個空陣列... – Peter

回答

2

我會把更多的東西分開,當你需要以後更改您的代碼,以及幫助。

下一步,你需要檢查的XPath的回報,您很可能希望只處理了第一場比賽(有每個文件一個編輯器?),你想它返回的字符串。

如果你把東西放到它自己的功能,它更容易使一個函數來只做一兩件事,所以它更容易調試和改進的東西。例如。你可以先測試是否editorFromFile的功能是什麼,應該再對多個文件運行它:

/** 
* get PeerReviewEditor from file 
* 
* @param string $file 
* @return string 
*/ 
function editorFromFile($file) 
{ 
    $xmldoc = simplexml_load_file($file); 
    $xmldoc->registerXPathNamespace("tei", "http://www.tei-c.org/ns/1.0"); 

    $node = $xmldoc->xpath("//tei:editor[@role='PeerReviewEditor'][1]"); 
    return (string) $node[0]; 
} 

/** 
* get editors from a path 
* 
* @param string $path 
* @return array 
*/ 
function editorlist($path) 
{ 
    $editors = array(); 
    $files = glob(sprintf('%s/*.xml', $path), GLOB_NOSORT); 
    foreach($files as $file) 
    { 
     $editors[] = editorFromFile($file); 
    } 
    return $editors; 
} 
+0

我喜歡這一點,非常感謝。 '%s/*'是另一種選擇目錄中所有文件的方式(與我通常使用的'readdir'函數不同)? – Jeff

+0

剛剛嘗試過,效果很好。我認爲這會幫助我向前邁進一步(也許我應該使這是一個新問題),但是如果我希望得到的數組$編輯器跳過空值(即未找到指定元素的xpath查詢)我的所有文件都有'PeerReviewEditors'。我想可能是我們可以添加到'editorFromFile'函數的東西。有任何想法嗎? – Jeff

+0

快捷方式是:'$ editors = array_filter($ editors);' – hakre

2

只是一個小更新:

function editorlist() { 
    $reviewEditorNames = array(); // init the array 

    $filename = readDirectory('../editedtranscriptions'); 
    foreach($filename as $file) { 
    $xmldoc = simplexml_load_file("../editedtranscriptions/$file"); 
    $xmldoc->registerXPathNamespace("tei", "http://www.tei-c.org/ns/1.0"); 

    // add to the array 
    $result = $xmldoc->xpath("//tei:editor[@role='PeerReviewEditor']"); 
    if (sizeof($result) > 0) { 
     $reviewEditorNames[] = (string)$result[0]; 
    } 
    } 

    // return the array 
    return $reviewEditorNames; 
} 
+0

非常感謝。這似乎工作,但我花了一段時間才意識到'$ reviewEditorNames'實際上是一個數組數組,我不得不將它分解兩次。任何建議將所有名稱變成一個數組而不是數組數組? – Jeff

+0

@Jeff:看到我的答案在下面,它處理這些問題和更多。 – hakre

+0

@Jeff看到更新,希望它有幫助;) – Yoshi