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

Форум PHP

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

 

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

вид форума:
Линейный форум Структурный форум

тема: Интеллектуальная уникальность элементов массива
 
 автор: Владимир55   (31.12.2009 в 13:07)   письмо автору
 
 

Есть массив, каждый элемент которого содержит от одного до пяти слов. Типа такого:
Курица
Собака
Кошка
Рыжая кошка
Лиса
Алиса в Зазеркалье
Дымчатая кошка
Рыжая лиса
Черно-бурая свинья
Лиса Алиса


Первая буква в некоторых случаях является прописной, а в некоторых строчной, и это соответствие необходимо сохранить. Но слова с буквами в разных регистрах расцениваются как одинаковые.


Из этого массива надо удалить все элементы, в которых есть хотя бы одно слово, находящееся в других элементах. Исходя из данного примера, останется:
Курица
Собака
Кошка
Алиса в Зазеркалье
Черно-бурая свинья
Лиса


Очевидное решение не проходит, поскольку в массиве примерно миллион элементов.

(Работа на Денвере).

  Ответить  
 
 автор: cheops   (31.12.2009 в 13:33)   письмо автору
 
   для: Владимир55   (31.12.2009 в 13:07)
 

Можно отталкиваться от следующего скрипта (он не очень экономный, если эту работу в режиме Online выполнять - его неплохо бы оптимизировать)
<?php
  $arr 
= array("Курица",
               
"Собака",
               
"Кошка",
               
"Рыжая кошка",
               
"Лиса",
               
"Алиса в Зазеркалье",
               
"Дымчатая кошка",
               
"Рыжая лиса",
               
"Черно-бурая свинья",
               
"Лиса Алиса");
  
// Количество элементов в массиве
  
$total count($arr);
  
// Массив элементов для удаления
  
$result = array();
  
// Перебираем все элементы массива
  
for($i 0$i $total$i++)
  {
    
// Проверяем не входит ли данный элемент в другой
    
for($j 0$j $total$j++)
    {
      if(
stripos($arr[$j], $arr[$i]) !== false && $j != $i$result[] = $j;
    }
  }
  
// Оставляем только уникальные значения
  
$result array_unique($result);
  
// Удаляем лишние элементы из массива $arr
  
for($i 0$i $total$i++)
  {
    if(
in_array($i$result)) unset($arr[$i]);
  }
  
// Результат
  
echo "<pre>";
  
print_r($arr);
  echo 
"</pre>";
?>

  Ответить  
 
 автор: Владимир55   (31.12.2009 в 15:56)   письмо автору
 
   для: cheops   (31.12.2009 в 13:33)
 

Спасибо!

  Ответить  
 
 автор: Владимир55   (31.12.2009 в 21:25)   письмо автору
 
   для: Владимир55   (31.12.2009 в 15:56)
 

Похоже, что программа удаляет и то, что надлежало бы оставить. Вот из этого:
 <?php    
$arr 
= array("Курица",
                
"Собака",
               
"Кошка",
               
"Рыжая кошка",
               
"Лиса",
               
"Алиса в Зазеркалье",
               
"Дымчатая кошка",
               
"Рыжая лиса",
               
"Черно-бурая свинья",
               
"Алиса",
               
"Лиса Алиса");


осталось:
Array
(
    [0] => Курица
    [1] => Собака
    [2] => Кошка
    [4] => Лиса
    [8] => Черно-бурая свинья
)


А куде же "Алиса" подевалась?

  Ответить  
 
 автор: cheops   (01.01.2010 в 01:56)   письмо автору
 
   для: Владимир55   (31.12.2009 в 21:25)
 

Хм.. да, "лиса" есть часть "Алиса", нужно тогда заменить stripos(), регулярным выражением
<?php 
  $arr 
= array("Курица"
               
"Собака"
               
"Кошка"
               
"Рыжая кошка"
               
"Лиса"
               
"Алиса в Зазеркалье"
               
"Дымчатая кошка"
               
"Рыжая лиса"
               
"Черно-бурая свинья"
               
"Алиса"
               
"Лиса Алиса");
  
// Количество элементов в массиве 
  
$total count($arr); 
  
// Массив элементов для удаления 
  
$result = array(); 
  
// Перебираем все элементы массива 
  
for($i 0$i $total$i++) 
  { 
    
// Проверяем не входит ли данный элемент в другой 
    
for($j 0$j $total$j++) 
    { 
      if(
preg_match("|\b".preg_quote($arr[$i])."\b|i",$arr[$j]) && $j != $i$result[] = $j
    } 
  } 
  
// Оставляем только уникальные значения 
  
$result array_unique($result); 
  
// Удаляем лишние элементы из массива $arr 
  
for($i 0$i $total$i++) 
  { 
    if(
in_array($i$result)) unset($arr[$i]); 
  } 
  
// Результат 
  
echo "<pre>"
  
print_r($arr); 
  echo 
"</pre>"
?>

  Ответить  
Rambler's Top100
вверх

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