在PHP中使用unset后,数组索引是否重新平衡?
我正在尝试使用unset从一组令牌中删除重复项(暂时不考虑array_unique),但是我遇到了一些问题在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++){
$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]++;
}
}
}
$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²次
$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已经提供的所有这些小的预定义函数。我想这些预定义的函数都经过了充分的优化,你自己做也没用,对吧?