Так что из-за некоторых неприятных проблем с картой я немного застрял здесь. В принципе, я беру строку из ввода пользователя и заменяю ее значением из моей модели, которое известно только во время разговора.PHP ассоциативный массив: уникальная функция для значения
Мои структуры так:
static public $placeholders = array("[REPLACE_STRING_1]"=>'firstName',
"[REPLACE_STRING_2]"=>'DateTime->format(\'aa,bb\')');
//Problem line above. Very messy, format is an arm long and painful
public function myfunction(ModelClass $master) {
$body = $this->sampleService->get('samplebody'); // populate body from DB
foreach(static::$placeholders as $key => $value){
$body = str_replace($key, $master->value, $body);
}
return $body;
}
Так что это делает для некоторых очень уродливый код. Мой босс хотел бы отредактировать его, чтобы функция была частью массива, назначенного каждой записи, которая запускалась для фильтрации/редактирования кода. Что-то вроде
function dateFormat($prop){
return $prop->format('aa,bb');
}
function asIs($prop){
return $prop;
}
static public $placeholders = array("[REPLACE_STRING_1]"=>['firstName', asIs]
"[REPLACE_STRING_2]"=>['DateTime', dateFormat]);
Существуют ли какие-либо существующие структуры или функции в PHP, которые делают это возможным, или его код желание просто несбыточная мечта?
EDIT: Я нашел решение, очень похожее на ответ, размещенный ниже, но с несколькими изменениями, необходимыми для передачи переменных.
function dateFormat ($prop, $master) {
return $master->$prop->format('aabb');
}
function asIs ($prop, $master) {
return $appointment->$prop;
}
static public $placeholders = array("[REPLACE_STRING_1]"=>['firstname','asIs'],
"[REPLACE_STRING_2]"=>['DateTime', dateFormat];
//instatiate service to get sampleService values
//main difference here
public function buildBody(ModelClass $master) {
$body = $this->sampleService->get('samplebody');
foreach(static::$placeholders as $key => $value){
$body = preg_replace_callback('/'.preg_quote($key).'/',
//Use closure here to pass in $master, otherwise laravel gets angry about strings instead of objects
function ($matches) use ($master) {
$placeholder = static::placeholders[$matches[0]];
$func = $placeholder[1];
$prop = $placeholder[0];
return call_user_func(array($this, $func), $prop, $appointment);
}, $body);
}
return $body;
}
В целом это была очень интересная проблема для меня, и я пытаюсь найти способ ее очистки еще больше. Идти, чтобы отметить ваш ответ как правильный, так как он очень помог добраться сюда.
Вы пробовали, что ваш босс хочет? Каковы результаты? –
В настоящий момент это синтаксическая ошибка. Я не уверен, есть ли способ применить функцию к объявлению ассоциативного массива inline. – mrfixij
Сообщите своему боссу, что это невозможно сделать с помощью PHP. Вам нужно будет иметь метод getter, который вызывает функции и возвращает результат - не может быть сделано во время вызова –