Как создать функцию внутри php цикла foreach?

Theres этот плагин WordPress называется формы ниндзя, http://developer.ninjaforms.com/codex/merge-tags/

        /* Individual tag registration. */
$this->merge_tags = array(

'foo' => array(
'id' => 'foo',
'tag' => '{my:foo}', // The tag to be  used.
'label' => __( 'Foo', 'my_plugin' ), // Translatable label for tag selection.
'callback' => 'foo' // Class method for processing the tag. See below.
),
);

/*
* Use the `init` and `admin_init` hooks for any necessary data setup that relies on WordPress.
* See: https://codex.wordpress.org/Plugin_API/Action_Reference
*/
add_action( 'init', array( $this, 'init' ) );
add_action( 'admin_init', array( $this, 'admin_init' ) );
}

public function init(){ /* This section intentionally left blank. */ }
public function admin_init(){ /* This section intentionally left blank. */ }

/**
* The callback method for the {my:foo} merge tag.
* @return string
*/
public function foo()
{
// Do stuff here.
return 'bar';

}
}

Значение callback затем используется как функция public function (foo).

Я добавил это в массив:

[foo] => Array
(
[id] => foo
[tag] => {my:foo}
[label] => Foo
[callback] => foo
)

[surveyid] => Array
(
[id] => surveyid
[tag] => {my:surveyid}
[label] => Surveyid
[callback] => surveyid
)

[membername] => Array
(
[id] => membername
[tag] => {my:membername}
[label] => Membername
[callback] => membername
)

Я добавил больше массивов с тем же форматом в этот массив, и id хотел бы сделать их значения «обратного вызова» открытыми функциями, как они имеют.

 /**
* The callback method for the {my:foo} merge tag.
* @return string
*/
public function foo()
{
// Do stuff here.
return 'bar';
}

Хотя я планирую сделать это много раз, и я могу добавить больше массивов в будущем. Поэтому я пытаюсь динамически назначить публичную функцию для каждого значения обратного вызова массивов.

Это то, что у меня есть.

        $data = array(

'@attributes' => array(
'surveyid' => 'V54236',
'membername' => 'John Smith',

));

$realThing = array();
foreach($data['@attributes'] as $key => $value) {
$realThing[$key] = array(
'id' =>  $key,
'tag' => '{my:'.$key.'}',
'label' => __( ucfirst($key), 'my_plugin' ),
'callback' => $key

);
}

$this->merge_tags = $realThing;

add_action( 'init', array( $this, 'init' ) );
add_action( 'admin_init', array( $this, 'admin_init' ) );
}

public function init(){ /* This section intentionally left blank. */ }
public function admin_init(){ /* This section intentionally left blank. */ }

}

Моя попытка назначить функции для каждого значения обратного вызова.

        foreach($realThing as $key => $value){
public function $key['callback'](){
return $data['@attributes'][$key];
}
};

желаемый результат:

  public function foo()
{
// Do stuff here.
return 'bar';
}

public function surveyid()
{
// Do stuff here.
return 'V54236';

public function membername()
{
// Do stuff here.
return 'John Smith';

Вся помощь приветствуется.

также получение: синтаксическая ошибка, неожиданный ‘foreach’ (T_FOREACH), ожидающая функция (T_FUNCTION) в

0

Решение

У вас есть некоторые ошибки в обработке данных, и вы должны объявить каждую функцию только один раз:

foreach($realThing as $key => $value){
if(!function_exists($value['callback'])){
public function $value['callback'](){
return $data['@attributes'][$key];
}
}
};

Однако этот код не работает, потому что переменная не разрешена в объявлении функции. Следующий код должен работать, но вы должны вызывать обратный вызов иначе, поскольку он хранится в массиве:

$callbacks = array();
foreach($realThing as $key => $value){
if(!isset($callbacks[$value['callback']])){
$callbacks[$value['callback']] = function () use ($data, $key){
return $data['@attributes'][$key];
};
}
};
unset($key);

echo $callbacks["surveyid"]();

Я почти уверен, что вы могли бы делать то, что хотите, другим способом.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]