2011-08-06 22 views
4

我有文字誰看起來像這樣索引詞

* MMM *我們有一隻狗
* PPP *我們回家
* SSS *我們已經回家

在本文中,*之間的文本是對第nr頁和第nr行的書的參考。在這種情況下,我只是把它縮小爲三個字母。

我想創建與每個字作爲密鑰和行號作爲值的數組:

Array 
(
    [we] => Array 
    (
     [0]=>*mmm*, 
     [1]=>*ppp*, 
     [2]=>*SSS* 
    ) 
    [have] => Array 
    (
     [0] => *mmm*, 
     [1] => *SSS* 
    ) 
) 

等....

其次我想創建與兩個詞的陣列以下彼此鍵和行號作爲值

Array 
(
    [we have] => array([0] => *mmm*, [1] => *SSS*), 
    [have a] => array([0 => *mmm*), 
    [a dog] => array([0] => *mmm*), 
    [dog we] => array([0] => *mmm*), 
    [we are] => array([0] => *ppp*) 
) 

注意,當兩個詞不在同一行(如在[dog we])它是第一個字的參考應該用作價值。

我想我找到了第一個問題的解決方案。我在改造一個數組 $text = array ([0]=>*mmm*, [1]=>"we", [2]=>"have",等文本...

然後:

foreach ($text as $word) 
{ 
    if($word[0] == "*") 
    { 
     $value = $word; 
     continue; 
    } 
    else 
    { 
     $key = $word; 
     if (array_key_exists($key,$dictionary)) 
     { 
      array_push($dictionary[$key], $value); 
     } 
     else 
     { 
      $dictionary[$key] = array($value); 
     } 
    } 
    return $dictionary; 

爲創建有兩個單詞的數組的我做了以下

foreach ($text as $word) 
{ 
    if($word[0] == "*") 
    { 
     $value = $word; 
     continue; 
    } 
    else 
    { 
     $key1 = $word; 
     $key2 = $text[array_search($key1,$text)+1]; 
     if ($key2[0] == "*") 
     { 
      continue; 
     } 
    else 
    { 
     $key = $key1.$key2; 
     if (array_key_exists($key,$dictionary)) 
     { 
      array_push($dictionary[$key], $value); 
     } 
     else 
     { 
      $dictionary[$key] = array($value); 
     } 
    } 
    return $dictionary; 
} 

這不起作用,因爲$key = $key1.$key2;。看來,當關鍵是[we have](如我們的文本中mmm)和稍後的關鍵應該是[we are]該程序沒有什麼區別。實際上,每當第一個單詞是「我們」時,即使它應該是「是」,他也會自動添加第二個單詞「have」。因此,這意味着在查看文本中的每個單詞時,$ key1不會被重新設置爲零,但每當第一個單詞是「我們」時,該值將被置於「我們有」的關鍵字下。

任何人都有這個解決方案,或者整個事情可以做得更簡單?

PS我希望我沒有忘了許多{}我沒有一個很好的概述

+0

你可以嘗試減少你的代碼?您不需要檢查密鑰是否已經存在於'Array'中,只需使用'array_key_exists'和'array_push'寫入'$ dictionary [$ key] [] = $ value'而不是if-block。接下來,第一個塊看起來不完整,缺少一個'}',就像你已經假設的那樣。請檢查。 – hakre

回答

0

在下面的代碼片段的小屏幕上打字,令牌化()列舉1字令牌和2字令牌以及它們的位置,reduce()通過令牌進行聚合。看看它是否適用於你的情況。

<?php 
$text = array('*mmm*', 'we', 'have', 'a', 'dog', '*ppp*', 'we', 'are', 'going', 'home', '*SSS*', 'we', 'have', 'gone', 'home'); 

function tokenize($text, $initPosition) { 
    $words = array(); 
    $position = $initPosition; 

    foreach ($text as $value) { 
    if ($value[0] === '*') { 
     $position = $value; 
    } else { 
     $words[] = array('token' => $value, 'pos' => $position); 
    } 
    } 

    $temp = $words; 
    for ($i = 0; $i < count($temp); $i++) { 
    if (isset($temp[$i + 1])) { 
     $token = $temp[$i]['token'] . ' ' . $temp[$i + 1]['token']; 
     $words[] = array('token' => $token, 'pos' => $temp[$i]['pos']); 
    } 
    } 
    return $words; 
} 

function reduce($words) { 
    $dictionary = array(); 
    foreach ($words as $value) { 
    if (isset($dictionary[$value['token']])) { 
     $dictionary[$value['token']][] = $value['pos']; 
    } else { 
     $dictionary[$value['token']] = array(); 
     $dictionary[$value['token']][] = $value['pos']; 
    } 
    } 
    return $dictionary; 
} 

$words = tokenize($text, '*mmm*'); 
$dictionary = reduce($words); 
print_r($dictionary); 
+0

這產生一個數組,其中的關鍵字等於文本的1個字,但我的問題主要涉及產生一個數組,其中的關鍵字等於2個字:Array ( [we have] => array([0] => * mmm *,[1] => * SSS *), [has a] => array([0 => * mmm *), [dog] => array([0] => * mmm *), [dog we] => array([0] => * mmm *), [we are] => array([0] => * ppp *) – Preys

+0

對不起以前的評論,它確實有效。謝謝 – Preys