$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 次,因此$matches["friendly friend of the friend company"] = 3。但是,由于您在成为 $people foreach 循环之前声明了 $matches,这意味着您在新人使用该关键字的任何时候都会覆盖此值。换句话说,如果第一个人有关键字“friend”,则$matches["friendly friend of the friend company"] 设置为 3。然后如果第二个人有关键字“friendly”,则该值被覆盖,$matches["friendly friend of the friend company"] 现在等于 1。
我认为您想要做的是计算有多少人拥有包含在职位名称中的关键字。在这种情况下,与其计算$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 实现的(非解释的,因此更快-运行语言)。