Предполагая, что вы начнете с этого:
$mask = "%name% (%user_count%) - %acyr% - %audience%";
$data = [
'%name%' => $group['name'],
'%user_count%' => $group['user_count'],
'%acyr%' => $group['acyr'],
'%audience%' => $group['audience'],
];
$result = strtr($mask, $data);
Каков наилучший способ изменить это так, что вы преобразуете $result
в следующие определенные и заполненные переменные?
(Также имейте в виду, что порядок $mask
может измениться.)
$name = '?';
$user_count = '?';
$acyr = '?';
$audience = '?';
Я пытался использовать preg_split()
/ list()
но я хочу $mask
управлять порядком переменных без необходимости превращать его в сложное регулярное выражение.
По сути, мне нужен простой метод разбора / разбиения строки на несколько переменных на основе маски, содержащей заполнители.
Маска может быть изменена путем изменения порядка заполнителей или добавления новой пунктуации, но логика достаточно гибкая, чтобы генерировать переменные.
<?php
$mask = "%name% (%user_count%) - %acyr% - %audience%";
$data = [
'%name%' => 'Year 1',
'%user_count%' => 999,
'%acyr%' => 2017,
'%audience%' => 'Staff and Students',
];
$result = strtr($mask, $data);
// Extract unique punctuation used in mask and form pattern for split
$pattern = '/[' . preg_replace('/[\w\s%]/', '', count_chars($mask, 3)) . ']/';
// Split, trim, remove blanks and reset array keys
$variables = array_values(array_filter(array_map('trim', preg_split($pattern, $mask, -1, PREG_SPLIT_NO_EMPTY)), 'strlen'));
$data = array_values(array_filter(array_map('trim', preg_split($pattern, $result, -1, PREG_SPLIT_NO_EMPTY)), 'strlen'));
foreach ($variables as $key => $variable_name) {
$variable_name = str_replace('%', '', $variable_name);
// Dynamically create variable
${$variable_name} = $data[$key];
}
var_dump("\$name: $name"); // Year 1
var_dump("\$user_count: $user_count"); // 999
var_dump("\$acyr: $acyr"); // 2017
var_dump("\$audience: $audience"); // Staff and Students
Других решений пока нет …