0

我可以做到这一点,我只是想知道是否有比我想出的 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

4

3 回答 3

1

您误用了 strpos/stripos。0如果您要搜索的字符串恰好位于“haystack”字符串的开头,例如您的Bob值,它们可以返回完全有效的字符串。您需要对此进行明确测试

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

如果 strpos/stripos 没有找到针,它们返回一个布尔值 false,在 PHP 的正常弱比较规则下等于/等价于 0。使用严格比较运算符 ( ===, !==),比较类型和值,你会得到正确的结果。

于 2012-11-14T16:05:18.020 回答
1

不要忘记 as-and !== falseneed ,你需要$k != $key让你的字符串不匹配自己。

于 2012-11-14T16:14:03.333 回答
0

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

  1. 您将每个键与每个键组合在一起,因此不仅是其他键,还有它本身。您将删除所有条目,因为"Bob"它也是 的子字符串"Bob"
  2. stripos如果未找到则返回,这可能与表示在位置找到的false混淆,后者也等于但不等同于。00false

您需要添加额外的检查以不删除相同的密钥,然后修复“未找到”情况的检查(演示):

$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
)
于 2012-11-14T16:42:26.977 回答