Php 从字符串数组中消除部分字符串

Php 从字符串数组中消除部分字符串,php,arrays,string,Php,Arrays,String,我可以做到这一点,我只是想知道是否有一个更优雅的解决方案比47黑客行的代码,我想出了 基本上我有一个数组(值是所述字符串的出现次数) 我希望遍历数组并消除其他数组的子字符串,以便最终结果是: [Theresa] => 3 [Bob at the farm house] => 1 最初我是这样循环的(称这个数组为$baseTags): 我假设我正在循环数组中的每个键,如果该键出现在另一个键中,则将其取消设置。。。但似乎对我不起作用。我错过了什么明显的东西吗 先谢谢你 -H您错误地使用

我可以做到这一点,我只是想知道是否有一个更优雅的解决方案比47黑客行的代码,我想出了

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

我希望遍历数组并消除其他数组的子字符串,以便最终结果是:

[Theresa] => 3
[Bob at the farm house] => 1
最初我是这样循环的(称这个数组为$baseTags):

我假设我正在循环数组中的每个键,如果该键出现在另一个键中,则将其取消设置。。。但似乎对我不起作用。我错过了什么明显的东西吗

先谢谢你


-H

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

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

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

不要忘记,还需要
!==false
,您需要
$k!=$键
以使字符串不匹配。

代码示例中存在两个问题:

  • 您可以将每个键与每个键组合在一起,这样不仅可以将其他键组合在一起,还可以将其自身组合在一起。您将删除所有条目,因为
    “Bob”
    也是
    “Bob”
    的子字符串
  • 如果未找到,则返回
    false
    ,这可能与
    0
    相混淆,后者表示在位置
    0
    处找到,也等于但不等于
    false
  • 您需要添加一个额外的检查以不删除同一个密钥,然后修复“未找到”案例()的检查:

    输出:

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

    我会死的。非常感谢。我会检查你是否正确,让我看看。根据你想要达到的目标,如果还有其他问题。有趣的是,我只是加了一句:)
    if (stripos($k, $key) !== FALSE) {
       unset(...);
    }
    
    $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
    )