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

needing と同様に、文字列が一致しないよう!== falseにする必要があることを忘れないでください。$k != $key

于 2012-11-14T16:14:03.333 に答える
1

strpos/stripos を誤用しています。0検索している文字列がたまたま「haystack」文字列の START にある場合、それらは完全に有効な値を返すことができBobます。これを明示的にテストする必要があります

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

strpos/stripos が針を見つけられない場合、ブール型の false を返します。これは、PHP の通常の弱い比較規則では 0 に等しい/同等です。型と値を比較する厳密な比較演算子 ( ===, !==) を使用すると、次の結果が得られます。適切な結果。

于 2012-11-14T16:05:18.020 に答える
0

コード例の中に 2 つの問題があります。

  1. 各キーを各キーと組み合わせて、他のキーだけでなく、それ自体も組み合わせます。"Bob"もの部分文字列であるため、すべてのエントリを削除します"Bob"
  2. striposこれは、 found at position の略で、 と同じですが、同一ではありませんfalseと混同される可能性があります。00false

同じキーを削除しないようにチェックを追加し、「見つからない」場合のチェックを修正する必要があります ( 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
)
于 2012-11-14T16:42:26.977 に答える