我试图回显每个数组键的测量单位的名称。
问题在于,有时候键值会有缩写,正如我在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
)
但要让它返回"工作"代码,我不得不在缩写字符前放一个1,这样strpos就不会匹配那些不正确的字符。
答案 0 :(得分:2)
缩写' c'为了杯子'太过分了。您需要检查它是否完整。您可以通过在空格中嵌入搜索字符串来实现这一点,因此请查找" c "
而不是"c"
,或者使用正则表达式并匹配字边界。
请注意,如果你改变了,你将不得不添加'盎司'杯子'和'汤匙' (复数形式)也针,否则你无法找到它们。实际上,我不会写一个缩写词,而是会保留一系列变体'对于每个单元,所以你得到类似的东西:
$needles =
array(
'0' => array(
'id' => '1',
'name' => 'cup',
'variations' => array('cups', 'cup', 'cp', 'c')
),
...
然后,您可以搜索每个针的每个变体。