PHP Заменить и редактировать элементы массива из ключевых слов

У меня есть следующий вход:

$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')
]

0

Решение

Хорошо, после попытки исправить бесконечные повторения, я нашел это:

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;
}

Может быть, кто-то может найти некоторые оптимизации.

0

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

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

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