Удалить все заданные слова из массива данных

118
14 декабря 2020, 12:00

Есть одномерный массив $arr, каждый элемент которого содержит текст. Этот текст может включать, а может не включать имена (Маша, Саша, Дима, Катя, Василиса Иннокентьевна, Клавдий Цезаревич, Иван Дурак и т.д. и т.п - список большой).

Подскажите, как можно средствами PHP отфильтровать эти самые имена? Список имен сохранен в отдельном файле filtr.txt

Требуется удалить не элементы массива, содержащие имена, а только сами имена из текста элемента.

Можно ли это сделать без использования регулярных выражений?

Answer 1
$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.

Answer 2

вариант без цикла:

$arr   = array(
  "Иван купил, а Иван продал",
  "лариса пришла",
  "Кот увидел",
  "Сотрудник Дима ушёл",
);
$names = array(
  "Иван"   => "",
  "лариса" => "Ольга",
  "Дима"   => "",
);

$arr = explode(chr(1), strtr(implode(chr(1), $arr), $names));

var_dump($arr);
Answer 3

Улучшенный вариант предыдущего ответа выглядит так:

<?php
$arr = [
  "Иван купил, а Иван продал",
  "лариса пришла",
  "Кот увидел",
  "Сотрудник Дима ушёл"
];
$names = [
  "Иван",
  "Лариса",
  "Дима"
];
foreach($arr as &$text) {
    $text = str_replace($names, '', $text);
}
var_dump($arr);
Answer 4

Ещё один вариант, только вместо перебора forech, используется array_map:

function rmName($name)
{
    $names = [
        "Иван",
        "Лариса",
        "Дима"
    ];
    return str_replace($names, "", $name);
}
$arr = [
    "Иван купил, а Иван продал",
    "Лариса пришла",
    "Кот увидел",
    "Сотрудник Дима ушёл"
];
$result = array_map("rmName", $arr);
print_r($result);
Answer 5

Немного добавлю про 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: Имена из файла

READ ALSO
Атрибуты поиска или фильтра

Атрибуты поиска или фильтра

В авито или в каких-то магазинах есть фильтры поиска или фильтры заказа товаранапример в Авито если выбрать Транспорт выводятся колонки...

101
Как организовать Random без повторений на Java?

Как организовать Random без повторений на Java?

Есть числа с 0 по 23Как сделать так, что бы при нажатии на кнопку генерировалось случайное число, которое не встречалось еще как минимум 2 раза?

128
не отображаются кириллицы на jsp странице

не отображаются кириллицы на jsp странице

В приложении есть локализация en/ru, файл localizationproperties находится в папке webapp/WEB-INF/classes

153