цикл while работает правильно в PHP? - PullRequest
0 голосов
/ 21 января 2012

Я хочу получить количество символов из следующих слов в строке.Например, если мой ввод I am John, то вывод должен быть таким:

1 // count of 'I'
4 // count of 'I am'
9 // count of 'I am John'

Я использую код, подобный этому, в PHP для этого процесса:

$string = 'I am John';
$words = explode(' ',$string);
$count_words = count($words);

$i =0;
while ($i<=$count_words){
    $word_length =0;
    $k=0;
    while($k<=$i){
        $word_length = strlen($words[$k-1]);
        $word_length = $word_length + strlen($words[$k]);
        $k++;
    }
    $word_length = $word_length + $i; // there is "$i" means "space"
    echo $word_length.'<br/>';
    $i++;

}

Но он возвращает результат, подобный следующему:

1
4
8
7

Почему?Где моя ошибка?Каким должен быть мой код?Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 21 января 2012
  1. Вы просматривали много слов.Когда вы используете count, он возвращает количество элементов в массиве.Помните, что массив начинается с 0.
  2. $ word_length + strlen ($ words [$ k - 1]);// Вы вычитали 1 Я думаю, что вы пытались обслуживать счетчик, но вы вычитаете -1 из 0, в результате чего пропускается первое слово.

CODE SNIPPET START

//Set up the words

$string = 'I am John';

$words = explode(' ',$string);

$count_words = count($words);

//Loop through the words
$i =0;

while ($i<$count_words){

$word_length =0;
$k=0;

$debugString = '';

//Loop through all the previous words to the current
while($k<= $i){

    //dont really need this since were adding the word length later
    //$word_length = strlen($words[$k]);

    //if you -1 from 0 you will get an undefined offest notice. You
    //want to look at your current word
    $word_length = $word_length + strlen($words[$k]);

    //A bit of debugging you can delete this once you have seen the results
    $debugString = $debugString ." ".$words[$k];

    $k++;
}

$word_length = $word_length + $i ; // there is "$i" means "space"

//Added the debugString for debugging so remove it once you have seen the results
echo $word_length." " .$debugString.' <br/>';
$i++;

}

КОД SNIPPET КОНЕЦ

1 голос
/ 21 января 2012
<?php
$string = 'I am John';
$words = explode(' ',$string);
$count_words = count($words);
$i =0;
while ($i<$count_words){
    if($i==0) {
    $wordsc[$i] = strlen($words[$i]);
    } else {
    $wordsc[$i] = strlen($words[$i])+1+$wordsc[$i-1];
    }
    echo $wordsc[$i]."<br>";
    $i++;
}
?>
1 голос
/ 21 января 2012

Ваша ошибка здесь:

$i =0;
while ($i<=$count_words){
   //....
}

$count_words равно 3, но вы повторяете 4 раз из-за <=. Вместо этого используйте <.

0 голосов
/ 24 октября 2017

Я с радостью предоставлю вам совершенно другой подход к генерации желаемых данных очень прямым способом. ( Демонстрация того, что последует )

var_export(preg_match_all('/ |$/','I am John',$out,PREG_OFFSET_CAPTURE)?array_column($out[0],1):'failure');

Выход:

array (
  0 => 1,
  1 => 4,
  2 => 9,
)

Определение длины каждой подстроки с приращением слова фактически совпадает с определением offset каждого завершающего пробела, или по последнему слову - полной длины строки.

preg_match_all () имеет встроенный «флаг» для этого: PREG_OFFSET_CAPTURE

preg_match_all() до того, как любая манипуляция с массивом выведет это:

array (
  0 => 
  array (
    0 => 
    array (
      0 => ' ',   // <-- the space after 'I' matched by ' '
      1 => 1,
    ),
    1 => 
    array (
      0 => ' ',  // <-- the space after 'am' matched by ' '
      1 => 4,
    ),
    2 => 
    array (
      0 => '',  // <-- the end of the string (after 'John') matched by '$'
      1 => 9,
    ),
  ),
)

array_column() используется в $out[0] для извлечения только значений смещения (исключая бесполезные пустые и пустые строки).


Вот еще один, совершенно другой метод:

array_reduce(preg_split('/(?= )/',$string),function($carry,$item){echo $carry+=strlen($item)," "; return $carry;},0);
output: 1 4 9 

Это разбивает строку на строку "нулевой ширины", за которой следует пробел. Это означает, что в процессе взрыва пробелы не теряются - это сохраняет длину строки и подстроки для простого добавления.

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