Помогите с циклами.

PHP:
$tags = array('мама', 'папа', 'дочь');

$strings = array('Сегодня мама пошла на работу', 'Не удержавшись папа громко чихнул', 'Дочь гуляла во дворе', 'А это текст где нет тегов');
$newstr = array();
foreach($strings as $string) {

    array_walk($tags, function(&$tag) use (&$string, &$newstr) {
        if(is_numeric($pos = stripos($string, $tag))) {

            $newstr[] = substr($string, 0, $pos + strlen($tag));
        }
    });

}
var_dump($newstr);
 
PHP:
$tags = array('мама', 'папа', 'дочь');
 
$strings = array('Сегодня мама пошла на работу', 'Не удержавшись папа громко чихнул', 'Дочь гуляла во дворе', 'А это текст где нет тегов');
$newstr = array();
foreach($strings as $string) {
 
    array_walk($tags, function(&$tag) use (&$string, &$newstr) {
        if(is_numeric($pos = stripos($string, $tag))) {
 
            $newstr[] = substr($string, 0, $pos + strlen($tag));
        }
    });
 
}
var_dump($newstr);
Сейчас посмотрел - данный код выдает на выходе массив по которому надо резать, а не обрезанную каждую строку из массива $strings по тегу или не обрезанную если тег не был найден. Примерно знаю как поправить, но боюсь данная структура кода для меня лично - тяжеловатая и без ошибок реализовать задумку - тяжело.
Да, еще. Не оставите ваши координаты для спасибо в виде ЯД кошелька.
 
Да, забыл добавить условие)
PHP:
$tags = array('мама', 'папа', 'дочь');
 
$strings = array('Сегодня мама пошла на работу', 'Не удержавшись папа громко чихнул', 'Дочь гуляла во дворе', 'А это текст где нет тегов');
$newstr = array();
foreach($strings as $string) {
 
    array_walk($tags, function(&$tag) use (&$string, &$newstr) {
        if(is_numeric($pos = stripos($string, $tag))) {
 
            $newstr[] = substr($string, 0, $pos + strlen($tag));
        }
else {
$newstr[] = $string;
}
    });
 
}
var_dump($newstr);

Если не верно работает - значит неправильно я понял условие задачи.
Покажите на моем примере что должно выдаваться по вашей задумке на выходе.

P.s.: Забыл добавить, что данная конструкция будет работать только в php 5.3+
 
Да, забыл добавить условие)
PHP:
$tags = array('мама', 'папа', 'дочь');
 
$strings = array('Сегодня мама пошла на работу', 'Не удержавшись папа громко чихнул', 'Дочь гуляла во дворе', 'А это текст где нет тегов');
$newstr = array();
foreach($strings as $string) {
 
    array_walk($tags, function(&$tag) use (&$string, &$newstr) {
        if(is_numeric($pos = stripos($string, $tag))) {
 
            $newstr[] = substr($string, 0, $pos + strlen($tag));
        }
else {
$newstr[] = $string;
}
    });
 
}
var_dump($newstr);

Если не верно работает - значит неправильно я понял условие задачи.
Покажите на моем примере что должно выдаваться по вашей задумке на выходе.

P.s.: Забыл добавить, что данная конструкция будет работать только в php 5.3+

Выдаваться должно
пошла на работу
громко чихнул
гуляла во дворе
А это текст где нет тегов

Вот такое)
 
Значит все-таки не верно понял.
Вот:
PHP:
$tags = array('мама', 'папа', 'дочь');
 
$strings = array('Сегодня мама пошла на работу', 'Не удержавшись папа громко чихнул', 'дочь гуляла во дворе', 'А это текст где нет тегов');
 
$newstr = array();
 
$k = 0;
 
foreach($strings as $string) {
 
    array_walk($tags, function(&$tag) use (&$string, &$newstr, &$k) {
 
        if(is_numeric($pos = stripos($string, $tag))) {
 
            $newstr[$k] = substr($string, $pos + strlen($tag));
 
        }
        elseif(!isset($newstr[$k])) {
            $newstr[$k] = $string;
        }
    });
    $k++;
 
}
 
var_dump($newstr);
 
Значит все-таки не верно понял.
Жалко, что на выходе массив.. У меня это часть кода внутри кода и $strings уже является не массивом, а переменной. И на выходе получить переменную наверно было-бы лучше. Не хочу как отдельный обработчик вставлять, апдейт будет долго производиться..
 
Жалко, что на выходе массив.. У меня это часть кода внутри кода и $strings уже является не массивом, а переменной.
Живые данные были бы нагляднее.
Не хочу как отдельный обработчик вставлять, апдейт будет долго производиться..
Этот код по идее должен отрабатывать достаточно быстро. Почему он будет долго производиться?
 
Живые данные были бы нагляднее.

Этот код по идее должен отрабатывать достаточно быстро. Почему он будет долго производиться?

Нет, то что код быстрый - это я вижу. Но UPDATE в мускуле при большом кол-ве строк и без ID-шников нормальных (ключей) выполнять не хотелось бы.
А по поводу живых данных - у меня идет обработка таблицы. Я в цикле забираю из базы каждую строку отдельно в массив, далее над каждым элементом строчки массива провожу действия - убираю символы лишние, регуляркой некой прохожусь, объединяю элементы массива в одну переменную.. И в итоге вношу все это уже в готовом систематизированном и обработанном виде в новую таблицу. У меня вылезло около 1500 строк, которые под общие правила не подходят, и для них решил сделать конкретное обрезание по данным тегам.
И думал вставить данный кусочек перед записью в мускул, чтобы он получил уже нужным образом обработанную строку и попробывал вырезать тег, оставив все что после него в переменной, которую уже буду заносить в базу. Т.е. у Вас представлена готовая функция, для обработки строк, а я думаю, что лучше, если оно принимало не массив на входе и не отдавала массив на выходе а принимала переменную, например Сегодня мама пошла на работу, проверял ее на теги и в $newstr вносил уже пошла на работу.
 
А по поводу живых данных - у меня идет обработка таблицы. Я в цикле забираю из базы каждую строку отдельно в массив
Не самый лучший вариант делать запросы в цикле =)
Не проще ли выбрать одним SELECT сразу все необходимые строки, а уже над массивом строк проводить действия в цикле?
а я думаю, что лучше, если оно принимало не массив на входе и не отдавала массив на выходе а принимала переменную, например Сегодня мама пошла на работу, проверял ее на теги и в $newstr вносил уже пошла на работу.
Да делов-то:
PHP:
$tags = array('мама', 'папа', 'дочь');
 
$string = 'Сегодня мама пошла на работу';
 
$newstr = '';
 
    array_walk($tags, function(&$tag) use (&$string, &$newstr, &$k) {
 
        if(is_numeric($pos = stripos($string, $tag))) {
 
            $newstr = substr($string, $pos + strlen($tag));
 
        }
        elseif(!empty($newstr)) {
            $newstr = $string;
        }
    });
 
var_dump($newstr);
 
Не самый лучший вариант делать запросы в цикле =)
Не проще ли выбрать одним SELECT сразу все необходимые строки, а уже над массивом строк проводить действия в цикле?
Вполне возможно.. Не знаю, как лучше. Около 150-ти тегов и около 1600 строчек выборки из 100 000... А так - построчно каждую строку из первой базы обрабатываю и записываю уже в новую табличку..


А проверял?))
string(28) "Сегодня мама пошла на работу"
 
Назад
Сверху