在多维数组中对具有相同索引ID的项的条目求和?

时间:2012-02-27 12:35:03

标签: php arrays multidimensional-array

我有一个包含可变数量的子数组的多维数组 每个子数组都包含一个数字键和值列表 我有一个单独的数组,它是针对多维数组的“array_intersect_key”函数的结果,该数组仅包含每个子数组中存在的键。

我想遍历intersect_key数组,并为其中的每个项目总结与多维数组中的匹配键相关联的值,然后获取总数并使用它来替换与in​​tersect_key数组中的键关联的值保持相同的索引ID。

每个数组中的键与数据库中文章的ID相关,与该键相关联的值是该文章中某个单词出现的次数。我正在尝试将与每篇文章相关的所有字数加在一起,以便我可以按相关性对它们进行排序。

创建数组的代码:

$arr_articles = array();
foreach($arr_words as $wordid => $word) {
    $query = "SELECT articleid,wordcount FROM index_wordsearch AS iws WHERE iws.keywordid = '$wordid'";
    $articlesearch = mysql_query($query);
    if (!$articlesearch) {
        die('Unable to search for articles matching the specified words: '.mysql_error());
    } else {
        $arr_ids = array();
        while ($row = mysql_fetch_assoc($articlesearch)) {
            $articleid = $row['articleid'];
            $wordcount = $row['wordcount'];
            $arr_ids["$articleid"] = "$wordcount";
        }
        $arr_aticles[] = $arr_ids;
    }
}
$arr_matches = call_user_func_array('array_intersect_key',$arr_articles);

我已经开始尝试通过再次使用call_user_func_array()调用来分支到自定义函数来解决这个问题,但这种方法感觉不对。

1 个答案:

答案 0 :(得分:1)

也许替换

$arr_ids["$articleid"] = "$wordcount";

if (!isset($arr_ids[$articleid]))
  $arr_ids[$articleid] = 0;

$arr_ids[$articleid] += $wordcount;

我建议性能,您使用单个SQL查询检索所有必需的数据(可能使用WHERE iws.keywordid IN (...)),然后在PHP循环中处理结果。一般来说,应该避免在循环中放入SQL查询。

编辑建议:

$query = "SELECT articleid, SUM(wordcount) AS wordcount
  FROM index_wordsearch
  WHERE keywordid IN (".implode(", ", array_keys($arr_words)).")
  GROUP BY articleid";

$articlesearch = mysql_query($query) or die('Unable to search for articles matching the specified words: '.mysql_error());

$arr_articles = array();
 
while ($row = mysql_fetch_assoc($articlesearch))
    $arr_articles[$row['articleid']] = $row['wordcount'];

print_r($arr_articles); // shows total matched word count for each article id