|
|
|
| Есть массив, каждый элемент которого содержит от одного до пяти слов. Типа такого:
Курица
Собака
Кошка
Рыжая кошка
Лиса
Алиса в Зазеркалье
Дымчатая кошка
Рыжая лиса
Черно-бурая свинья
Лиса Алиса
|
Первая буква в некоторых случаях является прописной, а в некоторых строчной, и это соответствие необходимо сохранить. Но слова с буквами в разных регистрах расцениваются как одинаковые.
Из этого массива надо удалить все элементы, в которых есть хотя бы одно слово, находящееся в других элементах. Исходя из данного примера, останется:
Курица
Собака
Кошка
Алиса в Зазеркалье
Черно-бурая свинья
Лиса
|
Очевидное решение не проходит, поскольку в массиве примерно миллион элементов.
(Работа на Денвере). | |
|
|
|
|
|
|
|
для: Владимир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>";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(31.12.2009 в 13:33)
| | Спасибо! | |
|
|
|
|
|
|
|
для: Владимир55
(31.12.2009 в 15:56)
| | Похоже, что программа удаляет и то, что надлежало бы оставить. Вот из этого:
<?php
$arr = array("Курица",
"Собака",
"Кошка",
"Рыжая кошка",
"Лиса",
"Алиса в Зазеркалье",
"Дымчатая кошка",
"Рыжая лиса",
"Черно-бурая свинья",
"Алиса",
"Лиса Алиса");
|
осталось:
Array
(
[0] => Курица
[1] => Собака
[2] => Кошка
[4] => Лиса
[8] => Черно-бурая свинья
)
|
А куде же "Алиса" подевалась? | |
|
|
|
|
|
|
|
для: Владимир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>";
?>
|
| |
|
|
|