2012-02-27 2 views
1

가변 개수의 하위 배열을 포함하는 다차원 배열이 있습니다.
각 하위 배열에는 숫자 키 및 값 목록이 들어 있습니다.
각 배열에있는 키만 들어있는 다차원 배열에 대한 "array_intersect_key"함수의 결과 인 별도의 배열이 있습니다.다차원 배열에서 동일한 색인 ID를 가진 항목의 항목을 합치십니까?

intersect_key 배열을 살펴보고 각 항목에 대해 다차원 배열 내의 일치하는 키와 관련된 값을 합친 다음 합계를 사용하여 intersect_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); 

I했습니다 사용자 정의 함수로 밖으로 분기 다시 call_user_func_array() 호출을 사용하여이 문제를 해결하기 위해 노력하고 시작하지만,이 방법은 느낌이 좋지 않습니다.

답변

1

아마로 교체 PHP 루프에서

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

$arr_ids[$articleid] += $wordcount; 

단일 SQL 쿼리 (아마도 WHERE iws.keywordid IN (...) 사용) 필요한 모든 데이터를 검색하는 것을 나는, 성능을 제시 한 후 처리 결과와

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

. 일반적으로 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 
+0

서리가 내린, 즉 $의 arr_ids''의 각 하위 배열로 작동하지 않을 것입니다 특정 단어이며, 문서 ID와 해당 단어 카운트의 목록을 포함하는 배열입니다 그 단어. –

+0

id와 단어 자체를 포함하는'$ arr_words '가 이미 있습니다. 이것은 사용자가 검색 한 단어 목록입니다 (단어 ID는 mysql 쿼리에서 채워집니다). –

+0

아, foreach 줄에서'$ arr_words '를 놓쳤습니다, 미안 해요. 나는 대답에서 그것을 제거합니다. 그러나'$ arr_ids [$ articleid] + = $ wordcount; '라는 아이디어는 여전히 유효해야합니다. –

관련 문제