PHP для и цикл цикла - PullRequest
       5

PHP для и цикл цикла

0 голосов
/ 30 октября 2018

Я просто хочу получить список слов из массива, который имеет больше и меньше 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];
        }
    }

1 Ответ

0 голосов
/ 30 октября 2018

Используйте 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 (привязанного к словам) вы должны выполнить полный цикл всех гласных.

В любом случае Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...