2011-07-29 24 views
0

私は次のことをする関数を書こうとしています。約20個のXMLファイルがあります(いつかは100を超えます)。各ファイルのヘッダーにはピアレビューエディタであった人<editor role="PeerReviewEditor">John Doe</editor>。これらのファイルが保存されているディレクトリを実行し、そのファイルのピアレビューエディタの名前を取得します。すべての異なる名前を含む変数$reviewEditorNamesで終わりたいです。 (私は編集者のリストなどを表示するためにこれを使用します)PHPを組み合わせた配列

ここまで私はこれまで何を得ています。私は最後の部分が心配です。私は$editorReviewName$editorReviewNamesに変換しようとしたのは、各ファイルの個体を結合するのではなく、指定されたファイル内に配列が存在することです(たとえ、指定されたファイルに名前が1つしかなくても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の戻り値をチェックする必要があります。最初の一致(ファイルごとに1つのエディタがありますか?)を処理したい場合は、文字列として返すことをお勧めします。

自分自身の機能に物事を入れれば、機能を一つにすることがより簡単になり、デバッグや改善が容易になります。例えば。 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

ちょうどそれを試して、素晴らしい作品。私は、これは私が一歩前進するのに役立つと思います(おそらく私はこれを新しい質問にしてください)が、結果の配列$ editorがnull値をスキップしたい場合はどうでしょうか?私のすべてのファイルにはまだ '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'は実際には配列の配列であることに気づくのにしばらく時間がかかりました。すべての名前を配列の配列ではなく1つの配列に変換するためのアドバイスはありますか? – Jeff

+0

@ジェフ:以下の私の答えを参照してください、それはそのような問題などを扱います。 – hakre

+0

@ジェフアップデートを見て、それが助けてくれる;) – Yoshi

関連する問題