$matches = new array();
foreach($people as $person){
foreach($jobs as $job){
foreach($person['keywords'] as $keyword){
$count = substr_count($job->title, $keyword);
if($count > 0) $matches[$job->title] = $count;
}
}
}
事实上,你的方法有点草率,但我认为这是因为你有一些特殊格式的数据,你必须解决?尽管除了只是马虎,我还是会看到一些丢失的数据,就像你处理的事情我不认为是有意的。
我看到你不是只是检查“是职位名称中的关键字”,而是“职位名称中的关键字有多少次”,然后你就是在存储这个职位。这意味着对于职位名称friendly friend of the friend company
,“关键字”的朋友出现3次,因此。由于您在成为$people
foreach循环之前声明了$matches
,但这意味着您在任何时候新用户拥有该关键字时都会覆盖该值。换句话说,如果第一个人有关键字“朋友”,那么$matches["friendly friend of the friend company"]
设置为3.然后,如果第二个人有关键字“友好”,则该值将被覆盖,并且$matches["friendly friend of the friend company"]
现在等于1.
I认为你想要做的是计数有多少人有一个关键字是包含在职位名称。在这种情况下,您应该看到,如果它出现,而不是计算$keyword
在$job->title
中出现的次数,并相应地做出响应。
$matches = new array();
foreach($people as $person){
foreach($jobs as $job){
foreach($person['keywords'] as $keyword){
if(strpos($job->title, $keyword) !== FALSE) /* "If $keyword exists in $job->title" */
$matches[$job->title]++; /* Increment "number of people who match" */
}
}
}
另一种可能性是,你想知道多少关键字一个特定的人曾其匹配给定的职务。在这种情况下,你会想每个人都有一个单独的数组。这是稍做修改而完成的。
$matches = new array();
foreach($people as $person){
$matches[$person] = new array();
foreach($jobs as $job){
foreach($person['keywords'] as $keyword){
if(strpos($job->title, $keyword) !== FALSE) /* "If $keyword exists in $job->title" */
$matches[$person][$job->title]++; /* Increment "number of keywords which match" */
}
}
}
,或者,你可以返回到计数关键字现在多少次比赛,因为每个人其实这是一个有意义的值(“以及如何做这项工作匹配”)
$matches = new array();
foreach($people as $person){
$matches[$person] = new array();
foreach($jobs as $job){
foreach($person['keywords'] as $keyword){
if($count = substr_count($job->title, $keyword)) /* if(0) = false */
$matches[$person][$job->title] += $count; /* Increase "number of keywords which match" by $count */
}
}
}
本质上,在解决让循环高效的问题之前,你需要弄清楚你的循环真正要完成的是什么。把这一点说出来,然后提高效率的最好方法就是将循环的迭代次数降到最低,并尽可能多地使用内置函数,因为这些函数都是用C语言实现的(一个非解释的,因此更快 - 运行语言)。
您是否考虑过使用关系数据库(例如:MySQL)而不是“大型XML文件”?因为他们是这样做的,你知道的。 – NullUserException 2010-10-06 16:42:55
你为什么一次只匹配一个人关键字?如果你打算使用substr_count函数,你为什么不传递一个更大的字符串作为第二个参数,即所有关键字的集合? – 2010-10-06 16:50:13
使用xpath来搜索XML文件不是更容易吗? – 2010-10-06 17:17:59