我只想从一个包含多于和少于3个元音的数组中获得一个单词列表,但是单独使用for循环如何才能做到这一点呢?
$name = array('jake', 'rita', 'ali', 'addert', 'siryteee', 'skeueei', 'wsewwauie', 'aaaaweefio');
$vowels = array('a', 'e', 'i', 'o', 'u');
$massiv = [ ];
$vowel = [ ];
for ($i = 0; $i < count($name); $i++) {
$massiv[ ] = $name[$i];
for ($j = 0; $j < count($vowels); $j++) {
$vowel[ ] = $vowels[$j];
}
}发布于 2018-10-31 02:41:01
使用Preg Grep:
$name = array('jake', 'rita', 'ali', 'addert', 'siryteee', 'skeueei', 'wsewwauie', 'aaaaweefio');
$vowels = array('a', 'e', 'i', 'o', 'u');
$pattern = '/('.implode('|',$vowels).'){3}/i';
print_r(preg_grep($pattern, $name));输出
Array
(
[4] => siryteee
[5] => skeueei
[6] => wsewwauie
[7] => aaaaweefio
)Sandbox
正则表达式非常简单。
/(a|e|i|o|u){3}/i匹配至少3个以下a|e|i|o|u的任意组合的任何内容。(..)为捕获组,|为或,{3}匹配3次。你可以使用{3,} 3或更多,但在这种情况下这并不重要,因为一旦你有了3,你就可以很好地寻找。\i标志使其不区分大小写。
只要每个数组项都是一个单词,这应该可以很好地工作,如果你有多个单词,那么就很难找到匹配的单词。
仅用于循环的
在这里,我将帮你一个忙
$name = array('jake', 'rita', 'ali', 'addert', 'siryteee', 'skeueei', 'wsewwauie', 'aaaaweefio');
$vowels = array('a', 'e', 'i', 'o', 'u');
$matches = [];
for ($i = 0; $i < count($name); $i++) {
$total = 0;
for ($j = 0; $j < count($vowels); $j++) {
$total += substr_count($name[$i], $vowels[$j]);
if($total > 2){
$matches[] = $name[$i];
break; //exit inner loop
}
}
}
print_r($matches);Sandbox
这里的主要问题是
字符串int substr_count (
$haystack,string $needle [,int $offset =0,int $length ])
substr_count()返回针子串在干草堆串中出现的次数。请注意,针是区分大小写的。
http://php.net/manual/en/function.substr-count.php
输出与第一个相同。然而,Preg Grep的好处(除了不区分大小写)是它保留了数组键,你可以在for each循环中复制,在添加匹配时添加$i索引:
$matches[$i] = $name[$i];这使匹配项与原始数组保持关联,这在某些情况下可能很有用。
如果你不想区分大小写,最简单的方法就是将单词小写。在一些边缘情况下,这是不起作用的,但对于大多数英语单词来说,它应该是可以的。
$name=strtolower($names[$i]);
//change $name to $names as it makes more sense
//when adding to the match array use $names[$i]
//that way we add the unmodified version to our matches另外,从性能的角度来看,通常在for循环(条件)之外进行计数会更好。
$name_len = count($name);
for ($i = 0; $i < $name_len; $i++)
//another way to do it is like this
for($i=0,$n=count($name);$i<$n;$i++)Summery
所以把所有这些放在一起
$names = array('jake', 'rita', 'ali', 'addert', 'siryteee', 'skeueei', 'wsewwauie', 'aaaaweefio');
$vowels = array('a', 'e', 'i', 'o', 'u');
$matches = [];
for ($i=0,$n=count($names);$i<$n;$i++) {
$total=0;
$name=strtolower($names[$i]);
for ($j=0,$v=count($vowels);$j<$v;$j++) {
//count lowercased version
$total += substr_count($name, $vowels[$j]);
if($total > 2){
$matches[$i] = $names[$i]; //use original in match
break; //exit inner loop
}
}
}
print_r($matches);您将获得相当于一个preg_grep调用的大约12行代码。
最后一件事
您拥有的代码只是将单词和元音传输到另一个数组。除了你会得到words*vowels更多的元音。因为对于外部for循环的每个循环(绑定到单词),您将执行所有元音的完整循环。
无论如何,尽情享受吧!
https://stackoverflow.com/questions/53070772
复制相似问题