У меня есть следующий вход:
$input = [
0 => '$id000001',
1 => '$id000002',
2 => '$id000003',
3 => 'Alexandre'
];
$keywords = [
'$id000001' => 'function_name($+2)',
'$id000002' => '$user',
'$id000003' => '$-1 = $+1'
];
Я хотел бы реализовать функцию, которая заменит $input
элементы с $keywords
элементы со следующим выводом:
[
0 => 'function_name($+2)',
1 => '$user',
2 => '$-1 = $+1',
3 => 'Alexandre'
];
Вот в чем дело, моя функция должна заменить все $(+|-)[0-9]+
элементы (как $+2
, $-1
, …) с $input
значение элемента (после его замены), а затем удалить их. Число — это индекс смещения строки:
$-1 = $+1
будет заменен на $user = 'Alexandre'
function_name($+2)
будет заменен на $-1 = $+1
(который $user = 'Alexandre'
)Итак, окончательный результат будет:
[
0 => function_name($user = 'Alexandre')
]
Хорошо, после попытки исправить бесконечные повторения, я нашел это:
function translate($input, array $keywords, $index = 0, $next = true)
{
if ((is_array($input) === true) &&
(array_key_exists($index, $input) === true))
{
$input[$index] = translate($input[$index], $keywords);
if (is_array($input[$index]) === true)
$input = translate($input, $keywords, $index + 1);
else
{
preg_match_all('/\$((?:\+|\-)[0-9]+)/i', $input[$index], $matches, PREG_SET_ORDER);
foreach ($matches as $match)
{
$element = 'false';
$offset = ($index + intval($match[1]));
$input = translate($input, $keywords, $offset, false);
if (array_key_exists($offset, $input) === true)
{
$element = $input[$offset];
unset($input[$offset]);
}
$input[$index] = str_replace($match[0], $element, $input[$index]);
}
if (empty($matches) === false)
$index--;
if ($next === true)
$input = translate(array_values($input), $keywords, $index + 1);
}
}
else if (is_array($input) === false)
$input = str_replace(array_keys($keywords), $keywords, $input);
return $input;
}
Может быть, кто-то может найти некоторые оптимизации.
Других решений пока нет …