2012-02-27 3 views
1

У меня есть многомерный массив, который содержит переменное количество вспомогательных массивов.
Каждый поддиапазон содержит список цифровых клавиш и значений.
У меня есть отдельный массив, который является результатом функции «array_intersect_key» против многомерного массива, который содержит только ключи, существующие в каждом подматрице.Суммировать записи элементов с одинаковым идентификатором индекса в многомерном массиве?

Я хочу пройти через массив intersect_key и для каждого элемента в нем суммировать значения, связанные с соответствующими ключами внутри многомерного массива, а затем взять общее количество и использовать это, чтобы заменить значение, связанное с ключом в массиве intersect_key сохраняя один и тот же идентификатор индекса.

Ключ в каждом массиве относится к идентификатору статьи в базе данных, значение, связанное с ключом, - это количество раз, когда определенное слово появляется в этой статье. Я пытаюсь добавить все количество слов, относящихся к каждой статье, поэтому я могу их упорядочить по релевантности.

код, который создает массивы:

$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

Может заменить

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

с

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

$arr_ids[$articleid] += $wordcount; 

Я предлагаю для работы, что Вы получите все необходимые данные с помощью одного запроса SQL (возможно с использованием WHERE iws.keywordid IN (...)), а затем результаты процесса в цикле PHP , Вообще говоря, следует исключить SQL-запрос в цикле.

EDIT предложение:

$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 
+0

морозный, что не будет работать, поскольку каждый суб массив '$ arr_ids' для конкретного слова и представляет собой массив, содержащий список идентификаторов статей и соответствующих подсчетов слов для этого слова. –

+0

Существует уже '$ arr_words', который содержит слово id и само слово, это список слов, которые пользователь искал (слово id заполнено из запроса mysql). –

+0

О, я пропустил '$ arr_words' в строке' foreach', извините. Я удаляю это из своего ответа. Но идея '$ arr_ids [$ articleid] + = $ wordcount;' должна оставаться актуальной. –

Смежные вопросы