Как разбить строку на несколько переменных на основе входной маски, указывающей порядок?

Предполагая, что вы начнете с этого:

$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 управлять порядком переменных без необходимости превращать его в сложное регулярное выражение.
По сути, мне нужен простой метод разбора / разбиения строки на несколько переменных на основе маски, содержащей заполнители.

1

Решение

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

Демонстрация кода PHP

<?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
0

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

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

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