Эта тема на forum.dklab.ru


egorr: preg_replace_callback(). Как скормить callback функции аргумент извне?
Пожалуйста помогите.
Пытаюсь произвести в строке замену по условию.
Ищу и разбираю якоря вида {1}. Выбираю число внутри скобок, и далее его нужно проверить на in_array.
Если да, то строка замены одна, если нет, но другая.


global $arr;
$arr = array(25,28,30,35,40,48);
function Replace($matches, $arr)
{

if(in_array($matches, $arr)){
return "<div class=\"not_for_sale\">".$matches[2]."</div>";
}

}

$File = preg_replace_callback($pattern, 'Replace', $File);

Проблема в том, что не получается Replace() скормить второй аргумент. Объявление global не помогло.
Что делать?
Юрий Насретдинов:
egorr
Сделайте ещё одну функцию, которая будет вызывать Replace с нужными Вам аргументами и передавайте ее в качестве callback()
egorr:
Пробовал такую конструкцию
$File = preg_replace_callback($pattern, call_user_func_array('Replace', array($matches, $arr)), $File);
Не работает.
Свою функцию вызывающую Replace() писал. Не работает.
Юрий Насретдинов:
Как же выглядит Ваша функция?
egorr:

function CallFunc($matches, $arr)
{
return Replace($matches, $arr);
}

Я попробовал покрутить global.
Определил $arr как global и внутри функции Replace().
И странное дело сотворилось: аргумент $arr был принят, но перед отрисовкой схемы(собственно результат работы всего этого огорода) сервер выдает пердюпреждение Warning: Missing argument 2 for Replace()
Если аргумент потерян, то как же рисуется таблица?
Я для простоты и наглядности упростил(временно)Replace()

global $arr;
$arr = "-- ";

function Replace($matches, $arr)
{
global $arr;
return "<div>".$arr.$matches[2]."</div>";
}

Получил вполне ожидаемый результат: схему с -- 1,-- 2,-- 3,-- 3,...-- 48.
И 48 ругательных строчек.
Я что-то ничего понять не могу. Зачем он ругается, если аргумент использует?
Юрий Насретдинов:
1. Что возвращает, по Вашему мнению, call_user_func ?
2. Какие аргументы принимает preg_replace_callback?
3. Что делает PHP, если функции передано недостаточно аргументов?
egorr:
В мане написано Вызывает пользовательскую функцию
Вероятно возвращает результат работы вызываемой функции. Я пробовал воспользоваться call_user_func_array, но с тем же результатом...
Какие аргументы принимает preg_replace_callback я знаю. Мануал пересказывать нет смысла.
$File = preg_replace_callback($pattern,'Replace', $File);
Здесь: $pattern ='/(\{)(\d+)(})/ix';, 'Replace' - имя функции Replace(), $File - строка для поиска.
С этим что-то не так?
Что делает PHP, если функции передано недостаточно аргументов?
Должен прекратить обработку. Обругаться. Это так?
Эти вопросы для того, чтобы выяснить градус моей дремучести?
dimagolov:
egorr, вот странно, вроде в мане явно сказано, что callback ф-я получает один аргумент - найденное совпадение, но у Вас упорно 2 аргумента у нее.
egorr:
dimagolov, я уже во всём разобрался.
Юрий Насретдинов:
egorr
Так и как же Вы сделали?
egorr:
Массив в функцию передаю через GLOBAL. Второй аргумент выбросил. Все работает.
Юрий Насретдинов:
egorr
Ну, да, вполне нормальный вариант для начала.
egorr:
С вызывающей функцией лучше? Чем?
Юрий Насретдинов:
egorr
Ну вот как раз тем, что у Вас нет лишних глобальных переменных, которые неявно используются для передачи данных в функцию.
egorr:
Да, Вы правы... При обращении двух админов к этой функции будут проблемы...
bæv:
Ветка выделена в отдельную тему «мусор»,
расположенную в форуме Мусоропровод (06 Мая 2009, 18:16).

Эта тема на forum.dklab.ru