1

Тема: Функція substr з урахуванням слів (задачка на четвірку)

Написати функцію типу

substring($string, $n)

котра приймає строковий параметр $string і числовий $n та повертає рядок який має не більше ніж $n символів а також не може бути перерваний всередині слова.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: Replace1

2

Re: Функція substr з урахуванням слів (задачка на четвірку)

А що таке слово? Це частина рядка між пробілами?

3

Re: Функція substr з урахуванням слів (задачка на четвірку)

а що таке рядок? стрінг без CR/CL ?

4

Re: Функція substr з урахуванням слів (задачка на четвірку)

А вбудовані функції використовувати можна? :)

function substring($string, $n) {
   return substr($string, 0, $n);
}

http://php.net/manual/en/function.substr.php

Якщо свій велосипед писати, то незабудьте перевірити символи utf-8, наприклад рядок "Україна"

5

Re: Функція substr з урахуванням слів (задачка на четвірку)

Оу, не побачив жирним надпис..
На цьому форумі така функція використовується. Там де останнє повідомлення. :)

6 Востаннє редагувалося Patron (22.09.2012 14:49:00)

Re: Функція substr з урахуванням слів (задачка на четвірку)

yooll написав:

А що таке слово? Це частина рядка між пробілами?

Слово
"Це частина рядка між пробілами?" - не обов'язково, перше слово у реченні не знаходиться між пробілами а перед пробілом. Останнє слово у реченні також не знаходиться між пробілами)))

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

7

Re: Функція substr з урахуванням слів (задачка на четвірку)

ping написав:

а що таке рядок? стрінг без CR/CL ?

Strings

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

8 Востаннє редагувалося Patron (22.09.2012 14:15:21)

Re: Функція substr з урахуванням слів (задачка на четвірку)

А вбудовані функції використовувати можна? :)

Дозволяю лише mb_substr, для того щоб впоратися з кодуванням. Все решта власні дуже мудрі алгоритми)))

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

9

Re: Функція substr з урахуванням слів (задачка на четвірку)

<?
function substring($str, $n)
{
    
    $explStr = explode(' ',$str);
    $arr = array();
    foreach($explStr as $item)
    {
        $arr['word'][] = $item;
        $arr['len'][] = strlen($item);
    }

    $len = '';
        $i=0;
    foreach($arr['len'] as $itemStr)
    {
            $len = $len + $itemStr;
            if($n <= $len)
            {
                    echo $arr['word'][$i];
                    die();
            }
            $i++;
    }

}
$str = 'php is hypertext preprocessor';
substring($str, 7);

кусок моєї хворрої фантазії

pew pew :D
Блоґ

10

Re: Функція substr з урахуванням слів (задачка на четвірку)

другий фореч можна забрати

pew pew :D
Блоґ

11 Востаннє редагувалося Patron (22.09.2012 18:23:50)

Re: Функція substr з урахуванням слів (задачка на четвірку)

2miroslav.chandler зовсім не те що потрібно
Вам потрібно виділити частину вхідного рядка так щоб результуючий рядок мав не більше ніж $n символів і не переривався посеред слова. Наприклад:

    $str = 'php is hypertext preprocessor';
    echo substring($str, 7)."<br/>";
    echo substring($str, 8)."<br/>";
    echo substring($str, 9)."<br/>";
    echo substring($str, 10)."<br/>";
    echo substring($str, 11)."<br/>";
    echo substring($str, 12)."<br/>";
    echo substring($str, 13)."<br/>";
    echo substring($str, 14)."<br/>";
    echo substring($str, 15)."<br/>";
    echo substring($str, 16)."<br/>";
       /*
          php is
          php is
          php is
          php is
          php is
          php is
          php is
          php is
          php is
          php is hypertext
          php is hypertext
       */
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

12

Re: Функція substr з урахуванням слів (задачка на четвірку)

а, поняв, потім подумаю)

pew pew :D
Блоґ

13

Re: Функція substr з урахуванням слів (задачка на четвірку)

Варіант з вбудованими функціями:

substr($string, 0, strrpos(substr($string, 0, $n), " ")

14 Востаннє редагувалося yooll (22.09.2012 22:46:30)

Re: Функція substr з урахуванням слів (задачка на четвірку)

Мій варіант:

function substring($str, $n)
{
   $k=0;
   $result="";
   for ($i=0; $i<strlen($str); $i++)
   {
      $result.=$str[$i];
      $k++;
      if($str[$i]==" ")
      {
         if($k<=$n)
         {
             echo $n."\t";
             echo $result."<br />";
             return;
         }
         else
         {
             $result="";
             $k=0;
          }                       
      }
   }    
}
$str = 'preprocessor hypertext is php '; //трішки схитрив - рядок закінчується на пробіл))
            
substring($str, 1);
substring($str, 3);
substring($str, 4);
substring($str, 5);
substring($str, 7);
substring($str, 9);
substring($str, 10);
substring($str, 11);
substring($str, 13);
substring($str, 15);
substring($str, 17);

Результат:
3    is
4    is
5    is
7    is
9    is
10    hypertext
11    hypertext
13    preprocessor
15    preprocessor
17    preprocessor

15 Востаннє редагувалося Patron (23.09.2012 00:28:45)

Re: Функція substr з урахуванням слів (задачка на четвірку)

Replace написав:

Варіант з вбудованими функціями:

substr($string, 0, strrpos(substr($string, 0, $n), " ")

Неправильне рішення. По-перше синтаксична помилка бо не вистачає однієї закриваючої дужки, по-друге функція завжди обрізає до першого пробіла у рядку з 0 до $n символів. А якщо після цього пробіла і до $n символів ще поміститься слово?

function substring ($string, $n) {
    return substr($string, 0, strrpos(substr($string, 0, $n), " "));
}
    $str = 'php is hypertext'; // 16 symbols
    echo substring($str, 10000)."<br/>"; // php is
        echo substring($str, 16)."<br/>"; // php is
       /*
Має бути
echo substring($str, 16)."<br/>"; // php is hypertext
*/
Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

16

Re: Функція substr з урахуванням слів (задачка на четвірку)

yooll написав:

Мій варіант:

function substring($str, $n)
{
   $k=0;
   $result="";
   for ($i=0; $i<strlen($str); $i++)
   {
      $result.=$str[$i];
      $k++;
      if($str[$i]==" ")
      {
         if($k<=$n)
         {
             echo $n."\t";
             echo $result."<br />";
             return;
         }
         else
         {
             $result="";
             $k=0;
          }                       
      }
   }    
}
$str = 'preprocessor hypertext is php '; //трішки схитрив - рядок закінчується на пробіл))
            
substring($str, 1);
substring($str, 3);
substring($str, 4);
substring($str, 5);
substring($str, 7);
substring($str, 9);
substring($str, 10);
substring($str, 11);
substring($str, 13);
substring($str, 15);
substring($str, 17);

Результат:
3    is
4    is
5    is
7    is
9    is
10    hypertext
11    hypertext
13    preprocessor
15    preprocessor
17    preprocessor

Щось є але не те що треба))) Вирізаємо частину рядка починаючи спочатку від першого символа.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

17

Re: Функція substr з урахуванням слів (задачка на четвірку)

Patron написав:
Replace написав:

Варіант з вбудованими функціями:

substr($string, 0, strrpos(substr($string, 0, $n), " ")

Неправильне рішення. По-перше синтаксична помилка бо не вистачає однієї закриваючої дужки, по-друге функція завжди обрізає до першого пробіла у рядку з 0 до $n символів. А якщо після цього пробіла і до $n символів ще поміститься слово або два?

З мобільного друкував. Забув дужку ще одну поставити.
Все правильно. Там не strpos, а strrpos

18 Востаннє редагувалося Patron (23.09.2012 00:35:34)

Re: Функція substr з урахуванням слів (задачка на четвірку)

Replace написав:
Patron написав:
Replace написав:

Варіант з вбудованими функціями:

substr($string, 0, strrpos(substr($string, 0, $n), " ")

Неправильне рішення. По-перше синтаксична помилка бо не вистачає однієї закриваючої дужки, по-друге функція завжди обрізає до першого пробіла у рядку з 0 до $n символів. А якщо після цього пробіла і до $n символів ще поміститься слово або два?

З мобільного друкував. Забув дужку ще одну поставити.
Все там правильно. Там не strpos, а strrpos

Ну як правильно? Дивися:

function substring ($string, $n) {
        return substr($string, 0, strrpos(substr($string, 0, $n), " "));
    }
    $str = 'not good';
    echo substring($str, 8)."<br/>"; //виводить "not", хоча весь рядок влазить у 8 символів

п.с навіть strrpos не рятує)

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

19

Re: Функція substr з урахуванням слів (задачка на четвірку)

так вже точно ок:

function substring ($string, $n) {
  return substr($string, 0, strrpos(substr($string . " ", 0, $n + 1), " "));
}

20 Востаннє редагувалося Patron (23.09.2012 00:53:34)

Re: Функція substr з урахуванням слів (задачка на четвірку)

Replace написав:

так вже точно ок:

function substring ($string, $n) {
  return substr($string, 0, strrpos(substr($string . " ", 0, $n + 1), " "));
}
$str = 'not good';
    echo substring($str, 8)."<br/>"; // виводить not

Неа)) Що тобі дасть +1 або +100500 якщо ти все одно після останнього пробіла відріжеш останнє слово?) Просто $n+1 символа може просто не бути бо рядок може мати всьго $n символів.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }