我有以下输入:
$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 :(得分: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;
}
也许,有人可以找到一些优化。