Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Вопросы о преобразовании массива в двумерный (задача из книги)

Сообщения:  [1-10]   [11-18] 

 
 автор: baston   (24.02.2010 в 11:38)   письмо автору
 
   для: sim5   (20.02.2010 в 06:07)
 

Вы правы, я просто усложнил себе задачу - привычка такая...
Решение однозначно такое (для обычных предложений, не утяжеленных данными, которые бы привели к некорректному результату):
$text = explode(".", trim($str, "."));
foreach($text as $key => $val)
{
  $text[$key] = explode(" ", trim($val));
}
echo "<pre>";
print_r($text);
echo "</pre>";

  Ответить  
 
 автор: sim5   (20.02.2010 в 06:07)   письмо автору
 
   для: baston   (19.02.2010 в 23:08)
 

Зада из учебника просит одно, вы же либо эту задачу иначе понимаете, либо решаете уже иную, свою.
В ней же требуется получить из строки три предложения, разбив их в последующем на массив. Заменив !? (кстати, зачем еще и с пробелом?) на точки, вы получите уже не три изначальных элемента массива.
Трудно сказать какую цель вы преследуете, но лучше решать конкретную задачу, не меняя на ходу условий ее, а находить способы ее решения, оптимизируя найденные. Коли вы учитесь, то первое, чему вы должны научиться, это среди набора стамесок уметь найти ту, которая вам необходима. А в РНР набор этих стамесок иногда с излишеством.

Не обязательно рег. выражения, есть еще масса функций работы с массивами. К рег. выражениям возможно придется прибегнуть, если, как вы сказали ранее, в строке будет e-mail, но тогда и суть задачи должна быть иной.

  Ответить  
 
 автор: baston   (19.02.2010 в 23:08)   письмо автору
 
   для: sim5   (19.02.2010 в 17:32)
 

Собственно говоря, получилось почти то же самое, но рабочее:
$badchar = array("! ", "? ");
$str = str_replace("\r\n", "", $str);
$str = str_replace($badchar, ". ", $str);
$text = explode(". ", rtrim($str, "."));

Говоря о другом подходе, вы имели в виду регулярные выражения?

  Ответить  
 
 автор: baston   (19.02.2010 в 17:34)   письмо автору
 
   для: sim5   (19.02.2010 в 17:32)
 

Вот елки зеленые, про трим-то я забыл совсем...
Спасибо, тестирую.

  Ответить  
 
 автор: sim5   (19.02.2010 в 17:32)   письмо автору
 
   для: baston   (19.02.2010 в 17:27)
 

Прежде чем такое утверждать, прочтите внимательно о функции trim(). Кроме нее есть и другие. И это только один способ, возможен и другой подход.

  Ответить  
 
 автор: baston   (19.02.2010 в 17:27)   письмо автору
 
   для: sim5   (19.02.2010 в 17:06)
 

Вы имеете в виду так:
$text = explode(". ", trim($str));

В этом случае под раздачу не попадают предложения с восклицательными знаками, вопросительные. И самое плохое - последнее предложение будет с точкой, в то время как предыдущие - без точки.
Для разбора предложений с такими знаками (!?) можно воспользоваться массивом. А вот как быть с последней точкой (или другим знаком в последнем предложении)?

  Ответить  
 
 автор: sim5   (19.02.2010 в 17:06)   письмо автору
 
   для: baston   (19.02.2010 в 17:02)
 

И кто же вам такой чудесный алгоритм подсказал? А не проще ли отрезать точку справа и explode?

  Ответить  
 
 автор: baston   (19.02.2010 в 17:02)   письмо автору
 
   для: baston   (19.02.2010 в 16:04)
 

Решил (подсказали алгоритм) так: ищем вхождения точек как признаки окончания предложения и заменяем их на спецсимвол. Затем уже функцией explode извлекаем наши предложения.
$badchar = array(".\"", ". ", ".\".");
$str = str_replace("\r\n", "", $str);
$str = str_replace($badchar, "ћ", $str);
$text = explode("ћ", $str);

  Ответить  
 
 автор: baston   (19.02.2010 в 16:04)   письмо автору
 
   для: baston   (18.02.2010 в 16:21)
 

Увы... Стоило добавить в предложение email и дополнительные переносы строк, как все решение пошло в разнос :(
Ладно, с переносами я придумал что делать. Избавимся от них заменой:
$str = str_replace("\r\n", "", $str);

А вос с точкой как концом предложения - затык...

  Ответить  
 
 автор: baston   (18.02.2010 в 16:21)   письмо автору
 
   для: sim5   (17.02.2010 в 18:23)
 

В итоге получился такой код (ниже). Долго думал, искал как избавится от переноса строк. Нашел, подсказали. Даже узнал, что такое PHP_EOL.
Потом думал, как же сделать двумерный массив - тут предыдущий код товарища и помог (в цикле foreach), сам бы не додумался, точно.
<?php
//Исходная строка
$str "текст строки с предложениями (см. выше).";
$text = array();
//Извлекаем предложения, используя разделители в виде точки и переносов строк
$tok strtok($str".\r\n");
//Заносим каждое предложение в массив (и избавляемся от лишних пробелов)
while($tok)
{
  
$text[] = trim($tok);
  
$tok strtok(".\r\n");
}
//Каждое слово каждого предожения заносим в массив
foreach($text as $key => $val)
{
  
$text[$key] = explode(" "$val);
}
echo 
"<pre>";
print_r($text);
echo 
"</pre>";
?>

  Ответить  

Сообщения:  [1-10]   [11-18] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования