我正在使用多维数组,并在字符串上使用explode
后访问它们。生成的数组应该嵌套'的出现次数。'在给定字符串中。例如,foo.bar.ok("foo")("酒吧")("好")。
当前,我正在做:
switch (count($_match)):
case 1:
$retVal = str_replace('{' . $match . '}', $$varName[$_match[0]], $retVal);
break;
case 2:
$retVal = str_replace('{' . $match . '}', $$varName[$_match[0]][$_match[1]], $retVal);
break;
case 3:
$retVal = str_replace('{' . $match . '}', $$varName[$_match[0]][$_match[1]][$_match[2]], $retVal);
break;
endswitch;
本质上,我希望使用一个循环有无限数量的$_match[x]
。
编辑生成的数组格式应为:$array[foo][bar][ok]
下面是我尝试过的一些例子:
$string = 'foo.bar.ok';
$exploded = explode('.', $string);
$bracketed = array_map(function($x) { return [$x]; }, $exploded);
echo "<pre>";var_dump($bracketed);
$bracketed = array_map(function($x) { return "['$x']"; }, $_match);
$result = implode('', $bracketed);
var_dump(eval('return $t' . $result . ';'));
第一个没有在嵌套结构中添加数组,它将它们列为0,1,2等,第二个工作,但它使用eval。
最后,按照建议使用循环是有效的。
for ($replace = $$varName[$_match[0]], $i = 1; $i < count($_match); $i++) {
if (isset($replace[$_match[$i]]))
$replace = $replace[$_match[$i]];
}
if (is_string($replace) || is_numeric($replace))
$retVal = str_replace('{' . $match . '}', $replace, $retVal);
我希望看到一个工作array_walk例子吗?-谢谢!
使用array_map()
和implode()
$string = 'foo.bar.ok';
$exploded = explode('.', $string);
$bracketed = array_map(function($x) { return "[$x]"; }, $exploded);
$result = implode('', $bracketed);
你想执行$$varName[$_match[0]][$_match[1]][$_match[2]...[$_match[count($_match)-1]
?
for ($var_name = $varName[$_match[0]], $i=1; $i<count($_match); $i++) {
$var_name = $var_name[$_match[$i]];
}
$retVal = str_replace('{' . $match . '}', $$var_name, $retVal);
用array_walk()
代替for()
可能会改善这一点。