我能做到这一点,我只是想知道是否有比我提出的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
答案 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)
您的代码示例中有两个问题:
"Bob"
也是"Bob"
的子字符串。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
)