PHP for和循环数组

k4emjkb1  于 2023-03-11  发布在  PHP
关注(0)|答案(1)|浏览(117)

我只想从一个数组中得到一个单词列表,这个数组有多于和少于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];
        }
    }
u91tlkcl

u91tlkcl1#

使用妊娠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

将任何内容与以下a|e|i|o|u的任意组合中的至少3个匹配。(..)是捕获组,|是或,{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
最重要的是
整数子字符串计数(字符串**$干草堆**,字符串**$针**[,整数**$偏移量**= 0 [,整数**$长度**]])

**substr_count()**返回needle子字符串在haystack字符串中出现的次数。请注意needle区分大小写。

http://php.net/manual/en/function.substr-count.php
与第一个相同的输出。然而,Preg Grep的好处(除了不区分大小写之外)是它保留了数组键,您可以在添加匹配项时添加$i索引,从而在for each循环中复制这一点:

$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

我还应该提到,从性能的Angular 来看,在for循环(condition)之外计数通常更好。

$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++)

夏日

所以把所有这些放在一起

$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);

您将得到大约12行代码,这些代码相当于一个preg_grep调用。
"最后一件事"
你的代码只是把单词和元音转移到另一个数组中,只不过你会得到words*vowels个元音,因为对于外层for循环的每一个循环(绑定到单词),你会对所有元音做一个完整的循环。
无论如何享受!

相关问题