在PHP中使用unset后是否重新平衡了数组索引?

时间:2015-01-17 01:21:54

标签: php arrays

我正在尝试使用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的新手,所以请耐心等待我!

2 个答案:

答案 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)

  1. 检查索引是否已设置。
  2. 你正在进行不必要的,重复的比较。基本上n²比较最多需要n²/ 2才能将数组中的每个值与其他每个值进行比较。
  3. 所以:

    $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²次。