2015-12-15 2 views
0

Так что из-за некоторых неприятных проблем с картой я немного застрял здесь. В принципе, я беру строку из ввода пользователя и заменяю ее значением из моей модели, которое известно только во время разговора.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; 
} 

В целом это была очень интересная проблема для меня, и я пытаюсь найти способ ее очистки еще больше. Идти, чтобы отметить ваш ответ как правильный, так как он очень помог добраться сюда.

+0

Вы пробовали, что ваш босс хочет? Каковы результаты? –

+0

В настоящий момент это синтаксическая ошибка. Я не уверен, есть ли способ применить функцию к объявлению ассоциативного массива inline. – mrfixij

+0

Сообщите своему боссу, что это невозможно сделать с помощью PHP. Вам нужно будет иметь метод getter, который вызывает функции и возвращает результат - не может быть сделано во время вызова –

ответ

0

Если бы я получил право вопрос, я бы с preg_replace_callback и сделать это примерно так:

function dateFormat($prop){ 
    return $prop; 
} 

function asIs($prop){ 
    return $prop; 
} 

static public $placeholders = array(
    "[REPLACE_STRING_1]"=>['firstName', 'asIs'], 
    "[REPLACE_STRING_2]"=>['DateTime', 'dateFormat'] 
); 

private function replace($matches) { 
    $placeholder = static::$placeholders[$matches[0]]; 
    $func = $placeholder[1]; 
    $prop = $placeholder[0]; 

    // this calls your class methods ('asIs', 'dateFormat') 
    // with $prop = 'firstName' etc. 
    return call_user_func(array($this, $func), $prop); 
} 

public function myfunction(ModelClass $master) { 
    $body = $this->sampleService->get('samplebody'); 

    foreach(static::$placeholders as $key => $value) { 
     // use a callback replace method instead of str_replace 
     $body = preg_replace_callback('/' . preg_quote($key) . '/', array($this, 'replace'), $body); 
    } 

    return $body; 
} 
+0

Я попробую это сегодня и посмотрю, работает ли это, но это должно быть то, что я ищу. Благодаря! – mrfixij

+0

Приближается к работе, но попадает в ловушку. Когда я вызываю DateFormat, он должен быть $ master -> $ value-> format() из-за ограничений, которые laravel помещает. кажется, что если я установил значение [0] в $ master- $ value [0], прежде чем передать его, он все еще считает это строкой типа, а не наследует от типа $ master. – mrfixij

+0

Вы можете попробовать добавить '$ master' в placeholder в myfunction' static :: $ placeholders ['REPLACE_STRING_2'] [2] = $ master; 'и в' function replace 'передать его как еще один параметр 'function dateFormat ($ prop, $ master) '(' return call_user_func (array ($ this, $ func), $ prop, $ placeholder [2]); ') – SJFrK