2017-10-17 3 views
1

各アレイキーの測定単位の名前をエコーアウトしようとしています。strposを使って大部分の単語にマッチさせるには?

問題は、haystack変数の最後のキー値に示されているように、時には略語を持つキー値があることです。

$haystack = array(
    '15.1 ounces white chocolate', 
    '1 ounce olive oil', 
    '½ cup whipping cream', 
    '1 tablespoon shredded coconut', 
    '1 tablespoon lemon', 
    '1 oz water' 
); 

$needles = 
    array(
     '0' => array(
      'id' => '1', 
      'name' => 'cup', 
      'abbreviation' => 'c' 
     ), 
     '1' => array(
      'id' => '2', 
      'name' => 'ounce', 
      'abbreviation' => 'oz' 
     ), 
     '2' => array(
      'id' => '3', 
      'name' => 'teaspoon', 
      'abbreviation' => 'tsp' 
     ), 
     '3' => array(
      'id' => '4', 
      'name' => 'tablespoon', 
      'abbreviation' => 'tbsp' 
    ) 
); 

foreach($haystack as $hay){ 
    foreach($needles as $needle){ 
     if(strpos($hay, $needle['name']) !== false || strpos($hay, $needle['abbreviation']) !== false){ 
      $names[] = $needle['id']; 
     } 
    } 
} 

上記のコードは返され、次の結果(http://codepad.org/yC47JLeC):

Array 
(
    [0] => cup 
    [1] => ounce 
    [2] => cup 
    [3] => ounce 
    [4] => cup 
    [5] => cup 
    [6] => tablespoon 
    [7] => tablespoon 
    [8] => ounce 
) 

私は何を達成しようとしているが、それは次のような結果を返すようにすることです(http://codepad.org/MZXNOGnr):

Array 
(
    [0] => 2 
    [1] => 2 
    [2] => 1 
    [3] => 4 
    [4] => 4 
    [5] => 2 
) 

しかし、 "働く"コードの結果を返すようにするには、strposが正しくないものと一致しないように、省略文字の前に1を置かなければなりませんでした。

答えて

2

「カップ」の略語「c」が多すぎます。それが完全な単語であるかどうかを確認する必要があります。スペースで検索文字列を埋め込むことでそれを行うことができるので、"c"の代わりに" c "を探すか、正規表現と単語境界でマッチングを使用します。

これを変更すると、 'ounces'、 'cups'、 'tablespoon'(複数形)を針に追加する必要があります。そうしないと、針を見つけることができません。あなたはその後、各針の各バリエーションを検索することができます

$needles = 
    array(
     '0' => array(
      'id' => '1', 
      'name' => 'cup', 
      'variations' => array('cups', 'cup', 'cp', 'c') 
     ), 
    ... 

:あなたのような何かを得ると思いますので、実際には、代わりに略語を書いて、私は、各ユニットのための「バリエーション」の配列を続けるだろう。

+1

私はこれが最良のアプローチであることに同意します。あなたの 'c'があまりにも曖昧な試合の瞬間です。 (なぜあなたはチョコレート、クリーム、ココナッツのマッチングを取っているのですか?) –

+0

あなたの例のように、各ユニットのシリアライズされたバリエーションをデータベースに格納していますが、文字列間に空白を埋め込むよりもはるかに効率的です。ありがとうございます。 – Craig

関連する問題