Есть одномерный массив $arr
, каждый элемент которого содержит текст. Этот текст может включать, а может не включать имена (Маша, Саша, Дима, Катя, Василиса Иннокентьевна, Клавдий Цезаревич, Иван Дурак
и т.д. и т.п - список большой).
Подскажите, как можно средствами PHP отфильтровать эти самые имена?
Список имен сохранен в отдельном файле filtr.txt
Требуется удалить не элементы массива, содержащие имена, а только сами имена из текста элемента.
Можно ли это сделать без использования регулярных выражений?
$arr = [
"Иван купил, а Иван продал",
"Лариса пришла",
"Кот увидел",
"Сотрудник Дима ушёл"
];
$names = [
"Иван",
"Лариса",
"Дима"
];
foreach($arr as $key => $text) {
$text = str_replace($names, "", $text);
$arr[$key] = $text;
}
var_dump($arr);
Результат:
array(4) {
[0]=>
string(29) " купил, а продал"
[1]=>
string(25) "лариса пришла"
[2]=>
string(19) "Кот увидел"
[3]=>
string(28) "Сотрудник ушёл"
}
Спасибо за подсказку @u_mulder.
вариант без цикла:
$arr = array(
"Иван купил, а Иван продал",
"лариса пришла",
"Кот увидел",
"Сотрудник Дима ушёл",
);
$names = array(
"Иван" => "",
"лариса" => "Ольга",
"Дима" => "",
);
$arr = explode(chr(1), strtr(implode(chr(1), $arr), $names));
var_dump($arr);
Улучшенный вариант предыдущего ответа выглядит так:
<?php
$arr = [
"Иван купил, а Иван продал",
"лариса пришла",
"Кот увидел",
"Сотрудник Дима ушёл"
];
$names = [
"Иван",
"Лариса",
"Дима"
];
foreach($arr as &$text) {
$text = str_replace($names, '', $text);
}
var_dump($arr);
Ещё один вариант, только вместо перебора forech
, используется array_map
:
function rmName($name)
{
$names = [
"Иван",
"Лариса",
"Дима"
];
return str_replace($names, "", $name);
}
$arr = [
"Иван купил, а Иван продал",
"Лариса пришла",
"Кот увидел",
"Сотрудник Дима ушёл"
];
$result = array_map("rmName", $arr);
print_r($result);
Немного добавлю про array_map и array_walk
<?php
$arr = [
"Иван купил, а Иван продал",
"Лариса пришла",
"Кот увидел",
"Сотрудник Дима ушёл"
];
$names_raw = file_get_contnent('filtr.txt');
$names = explode(PHP_EOL, $names_raw);
// Если нужен другой массив
$arr2 = array_map(function($value) use ($names) {return str_replace($names, '', $value);}, $arr);
// Если нужно поменять текущий
array_walk($arr, function(& $item, $key, $names) {$item = str_replace($names, '', $item);}, $names);
Наверное стоит пояснить вкратце:
array_map применяет callback функцию ко всем элементам массива и отдаёт новый массив
array_walk применяет callback функцию к каждому элементу массива, и сообщает удалось ему это сделать или нет, в качестве третьего аргумента можно передать 3 параметр для callback функции
Update: Имена из файла
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В авито или в каких-то магазинах есть фильтры поиска или фильтры заказа товаранапример в Авито если выбрать Транспорт выводятся колонки...
Есть числа с 0 по 23Как сделать так, что бы при нажатии на кнопку генерировалось случайное число, которое не встречалось еще как минимум 2 раза?
В приложении есть локализация en/ru, файл localizationproperties находится в папке webapp/WEB-INF/classes