Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用unset后,数组索引是否重新平衡?_Php_Arrays - Fatal编程技术网

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

在PHP中使用unset后,数组索引是否重新平衡?,php,arrays,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++){

我正在尝试使用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 );
$keywords=parseTweet($tweet);
$term_freq=数组(计数($keywords));
对于($i=0;$i
我知道我为什么会出错;虽然删除了重复的$j,但是for循环仍然必须重新循环其余的关键字,因此在遇到缺少的$j时将失败。检查数组的内容时,我发现数组的索引跳过了索引$j。它是这样写的;[1], [2], [4], ... etc,其中$j=[3]


我认为unset还重新平衡了数组索引,我是做错了什么还是完全遗漏了什么?我是新来的PHP,所以请容忍我

使用
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]++; 
        }
    }
}

使用
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]++; 
        }
    }
}
  • 检查是否设置了索引
  • 你在做不必要的重复性比较。基本上是n²比较,在将数组中的每个值与其他值进行比较时,最多需要n²/2
  • 因此:

    $c=count($keywords)
    对于($i=0;$i<$c;$i++){
    $term_freq[$i]=1;
    对于($j=$i+1;$j<$c;$j++){//magic是$j=$i+1
    如果(!isset($keywords[$j]){continue;}//跳过未设置的索引
    else if(strcmp($keywords[$i],$keywords[$j])==0){
    未设置($keywords[$j]);
    未设置($term_freq[$j]);
    $term_freq[$i]++;
    }
    }
    }
    
    基本上,您知道您已经检查了
    $i
    之前的所有内容,因此可以从
    $i+1
    开始内部循环,而不是从零开始

    此外,您只需要计算一次
    $关键字
    ,而不是n²次

  • 检查是否设置了索引
  • 您正在进行不必要的重复比较。基本上是n²比较,而将数组中的每个值与其他值进行比较最多需要n²/2
  • 因此:

    $c=count($keywords)
    对于($i=0;$i<$c;$i++){
    $term_freq[$i]=1;
    对于($j=$i+1;$j<$c;$j++){//magic是$j=$i+1
    如果(!isset($keywords[$j]){continue;}//跳过未设置的索引
    else if(strcmp($keywords[$i],$keywords[$j])==0){
    未设置($keywords[$j]);
    未设置($term_freq[$j]);
    $term_freq[$i]++;
    }
    }
    }
    
    基本上,您知道您已经检查了
    $i
    之前的所有内容,因此可以从
    $i+1
    开始内部循环,而不是从零开始


    此外,您只需计算
    $keywords
    一次,而不是n次。

    这没有意义:
    取消设置($term\u freq[$j]);$term\u freq[$j]++
    您取消设置并想要增加它?为什么要用
    计数($keywords)初始化
    $term\u freq
    的第一个元素
    ?for
    循环的
    的第一次迭代将覆盖此内容。如果您使用
    foreach
    而不是
    for
    ,它只会看到仍然存在的元素。@Rizier123错误地引用了删除的元素,而不是预期的元素!@Barmar不幸的是,我做了一个非常短视的假设,而且是错误的我认为我实际上启动了数组的大小,而不是第一个元素。这没有意义:
    unset($term\u freq[$j]);$term\u freq[$j]++;
    你取消了它的设置并想增加它?为什么你要用
    count($关键字)初始化
    $term\u freq
    的第一个元素
    ?for
    循环的
    的第一次迭代将覆盖此内容。如果您使用
    foreach
    而不是
    for
    ,它只会看到仍然存在的元素。@Rizier123错误地引用了删除的元素,而不是预期的元素!@Barmar不幸的是,我做了一个非常短视的假设,而且是错误的我认为我实际上启动了数组的大小,而不是第一个元素。@cHao纠正了这一点。重新考虑一下,这种方法仍然会扩展得非常厉害。最好是[用有效的算法]对数组进行排序然后遍历它以计数/消除重复的邻居。如果我理解原始代码的目标,最好只使用
    array\u count\u值
    array\u unique
    。但这就是它们。:)最后我改用了“array\u count\u values”,非常感谢。我真的需要习惯php已经提供的所有这些小的预定义函数。我想这些预定义函数都经过了充分的优化,你自己做是没有用的,对吧?@cHao纠正了。考虑到这一点,这种方法仍然会扩展得非常厉害。最好是[用有效的算法]对数组进行排序,然后遍历它以计数/消除重复的邻居。如果我理解原始代码的目标,最好只使用
    array\u count\u值
    array\u unique
    。但这就是他们的目的。:)我最终使用了“array\u count\u值”来代替,谢谢。我真的需要习惯php已经提供的所有这些小的预定义函数。我想这些预定义的函数都经过了充分的优化,你自己做也没用,对吧?