【发布时间】:2011-10-21 12:53:10
【问题描述】:
我有这样的文字
*嗯*我们有一条狗
*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] 时,程序并没有什么不同。事实上,每次第一个词是“我们”时,他都会自动添加第二个词“拥有”,即使它应该是“是”。所以这意味着在遍历文本的每个单词时,$key1 不会恢复为零,而是每次第一个单词是“我们”时,值都会放在键“我们拥有”下。
任何人对此都有解决方案,或者整个事情可以更简单地完成?
PS 我希望我没有忘记很多 {} 我在没有很好概述的情况下在小屏幕上输入此内容
【问题讨论】:
-
你能试着减少你的代码吗?您无需检查密钥是否已存在于
Array中,只需编写$dictionary[$key][] = $value而不是带有array_key_exists和array_push的if 块。接下来,第一个块看起来不完整,缺少}或您已经假设的那样。请检查。