我正在尝试使用unset从一组标记中删除重复项(暂时不考虑array_unique),但是我遇到了一些问题。
$keywords = parseTweet ( $tweet );
$term_freq = array(count($keywords));
for($i = 0; $i < count($keywords); $i++){
$term_freq[$i] = 1;
for($j = 0; $j < count($keywords); $j++){
if (($i != $j) && (strcmp($keywords[$i],$keywords[$j]) == 0)){
unset ( $keywords [$j] );
unset ( $term_freq [$j] );
$term_freq[$i]++;
}
}
}
print_r ( $keywords );
print_r ( $term_freq );
我知道为什么我会收到错误;当重复的$ j被删除时,for循环仍然必须重新循环其余的关键字,因此当它遇到缺少 $ j时将失败。检查数组的内容,我发现数组的索引跳过索引$ j。所以它读到; [1],[2],[4],......等,其中$ j = [3]
我认为unset也会重新平衡数组索引,我做错了什么或完全丢失了什么?我是PHP的新手,所以请耐心等待我!
答案 0 :(得分:2)
使用foreach
代替for
。
foreach ($keywords as $i => $kw1){
$term_freq[$i] = 1;
foreach ($keywords as $j => $kw2){
if (($i != $j) && ($kw1 == $kw2){
unset ( $keywords [$j] );
unset ( $term_freq [$j] );
$term_freq[$i]++;
}
}
}
答案 1 :(得分:2)
所以:
$c = count($keywords)
for($i = 0; $i < $c; $i++){
$term_freq[$i] = 1;
for($j = $i+1; $j < $c; $j++){ // magic is $j = $i+1
if( ! isset($keywords[$j]) { continue; } // skip unset indices
else if ( strcmp($keywords[$i],$keywords[$j]) == 0 ){
unset ( $keywords [$j] );
unset ( $term_freq [$j] );
$term_freq[$i]++;
}
}
}
基本上你知道你已经检查了$i
之前的所有内容,所以你可以在$i+1
开始内循环而不是零。
此外,您只需要计算$keywords
一次,而不是n²次。