首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP for and循环数组

PHP for and循环数组
EN

Stack Overflow用户
提问于 2018-10-31 02:33:39
回答 1查看 47关注 0票数 0

我只想从一个包含多于和少于3个元音的数组中获得一个单词列表,但是单独使用for循环如何才能做到这一点呢?

代码语言:javascript
复制
$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];
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2018-10-31 02:41:01

使用Preg Grep:

代码语言:javascript
复制
$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));

输出

代码语言:javascript
复制
Array
(
    [4] => siryteee
    [5] => skeueei
    [6] => wsewwauie
    [7] => aaaaweefio
)

Sandbox

正则表达式非常简单。

代码语言:javascript
复制
/(a|e|i|o|u){3}/i

匹配至少3个以下a|e|i|o|u的任意组合的任何内容。(..)为捕获组,|为或,{3}匹配3次。你可以使用{3,} 3或更多,但在这种情况下这并不重要,因为一旦你有了3,你就可以很好地寻找。\i标志使其不区分大小写。

只要每个数组项都是一个单词,这应该可以很好地工作,如果你有多个单词,那么就很难找到匹配的单词。

仅用于循环的

在这里,我将帮你一个忙

代码语言:javascript
复制
$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索引:

代码语言:javascript
复制
$matches[$i] = $name[$i];

这使匹配项与原始数组保持关联,这在某些情况下可能很有用。

如果你不想区分大小写,最简单的方法就是将单词小写。在一些边缘情况下,这是不起作用的,但对于大多数英语单词来说,它应该是可以的。

代码语言:javascript
复制
  $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循环(条件)之外进行计数会更好。

代码语言:javascript
复制
$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

所以把所有这些放在一起

代码语言:javascript
复制
$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循环的每个循环(绑定到单词),您将执行所有元音的完整循环。

无论如何,尽情享受吧!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53070772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档