消除字符串数组中的部分字符串PHP

时间:2012-11-14 16:02:08

标签: php arrays string

我能做到这一点,我只是想知道是否有比我提出的47条黑客代码行更优雅的解决方案...

基本上我有一个数组(值是所述字符串的出现次数);

[Bob] => 2
[Theresa] => 3
[The farm house] => 2
[Bob at the farm house] => 1

我想迭代数组并删除任何其他子字符串的条目,以便最终结果;

[Theresa] => 3
[Bob at the farm house] => 1

最初我正在循环(调用此数组$ baseTags):

foreach($baseTags as $key=>$count){
   foreach($baseTags as $k=>$c){
      if(stripos($k,$key)){
            unset($baseTags[$key]);
      }
   }
}

我假设我正在循环遍历数组中的每个键,如果在另一个键中出现了该键以取消它...但似乎对我不起作用。我错过了一些明显的东西吗

提前谢谢。

-H

3 个答案:

答案 0 :(得分:1)

你错误地使用了strpos / stripos。如果您正在搜索的字符串碰巧位于“haystack”字符串的START处,则它们可以返回完全有效的0,例如您的Bob值。您需要使用

显式测试
if (stripos($k, $key) !== FALSE) {
   unset(...);
}

如果strpos / stripos没有找到针,则返回布尔值false,这在PHP的正常弱比较规则下等于/等于0.使用严格比较运算符(===,{{1} }),比较类型AND值,你会得到正确的结果。

答案 1 :(得分:1)

不要忘记,只要需要!== false,您需要$k != $key,因此您的字符串与自己不匹配。

答案 2 :(得分:0)

您的代码示例中有两个问题:

  1. 您将每个键与每个键组合在一起,不仅是其他键,还包括其自身。您将删除所有条目,因为"Bob"也是"Bob"的子字符串。
  2. 如果找不到,则{li> stripos会返回false,而0代表位置0上找到的false,它与{{1}相同但不相同}}。

    您需要添加额外的检查,以便不删除相同的键,然后修复“未找到”案例(Demo)的检查:

    $baseTags = array(
        'Bob' => 2,
        'Theresa' => 3,
        'The farm house' => 2,
        'Bob at the farm house' => 1,
    );
    
    foreach ($baseTags as $key => $count)
    {
       foreach ($baseTags as $k => $c)
       {
          if ($k === $key)
          {
              continue;
          }
    
          if (false !== stripos($k, $key))
          {
                unset($baseTags[$key]);
          }
       }
    }
    
    print_r($baseTags);
    

    输出:

    Array
    (
        [Theresa] => 3
        [Bob at the farm house] => 1
    )