Используйте 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
)
Песочница
Регулярное выражение довольно прямолинейно
/(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);
Песочница
Главное здесь
int substr_count (строка $ стог сена , строка $ needle [, int $ offset = 0 [, int $ length ]])
substr_count () возвращает число раз, когда подстрока иглы встречается в строке сена. Обратите внимание, что игла чувствительна к регистру.
http://php.net/manual/en/function.substr-count.php
Тот же вывод, что и первый. Однако хорошая вещь в Preg Grep (помимо нечувствительности к регистру) состоит в том, что он сохраняет ключи массива, вы можете повторить это в каждом цикле, добавив индекс $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);
Вы получите около 12 строк кода, которые эквивалентны одному preg_grep
вызову.
ПОСЛЕДНИЕ ВЕЩИ
Код, который вы имели, просто переносил слова и гласные в другой массив. За исключением того, что вы получили бы words*vowels
больше гласных. Потому что для каждого цикла внешнего цикла for (привязанного к словам) вы должны выполнить полный цикл всех гласных.
В любом случае Наслаждайтесь!