各アレイキーの測定単位の名前をエコーアウトしようとしています。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を置かなければなりませんでした。
私はこれが最良のアプローチであることに同意します。あなたの 'c'があまりにも曖昧な試合の瞬間です。 (なぜあなたはチョコレート、クリーム、ココナッツのマッチングを取っているのですか?) –
あなたの例のように、各ユニットのシリアライズされたバリエーションをデータベースに格納していますが、文字列間に空白を埋め込むよりもはるかに効率的です。ありがとうございます。 – Craig