Php 在模板中调用多维关联数组
我正在构建一个小模板系统,我正在寻找一种使用点调用多维关联数组的方法。例如:Php 在模板中调用多维关联数组,php,Php,我正在构建一个小模板系统,我正在寻找一种使用点调用多维关联数组的方法。例如: $animals = array( 'four-legged' => array ( 'cute' => 'no', 'ugly' => 'no', 'smart' => array('best' => 'dog',
$animals = array(
'four-legged' => array (
'cute' => 'no',
'ugly' => 'no',
'smart' => array('best' => 'dog','worst' => 'willy')
),
'123' => '456',
'abc' => 'def'
);
然后,在我的模板中,如果我想展示“狗”,我会放:
{a.four-legged.smart.best}好吧,给定一个带有
four-legged.smart.best的字符串:
function getElementFromPath(array $array, $path) {
$parts = explode('.', $path);
$tmp = $array;
foreach ($parts as $part) {
if (!isset($tmp[$part])) {
return ''; //Path is invalid
} else {
$tmp = $tmp[$part];
}
}
return $tmp; //If we reached this far, $tmp has the result of the path
}
所以你可以打电话:
$foo = getElementFromPath($array, 'four-legged.smart.worst');
echo $foo; // willy
如果您想编写元素,这并不难(您只需要使用引用,如果路径不存在,还需要进行一些检查以默认值)
编辑:由于这是在模板系统中,因此可能值得将数组向下“编译”到单个维度一次,而不是每次都遍历它(出于性能原因)
因此,这将转换为:
$animals = array(
'four-legged' => array (
'cute' => 'no',
'ugly' => 'no',
'smart' => array(
'best' => 'dog',
'worst' => 'willy'
)
),
'123' => '456',
'abc' => 'def'
);
进入
然后您的查找就变成了$value=isset($compiledArray[$path])$compiledArray[$path]:''
而不是$value=getElementFromPath($array,$path)代码>
它用预计算换取内联速度(循环内的速度).好吧,给定一个带有四条腿的字符串。smart。最差的:
function getElementFromPath(array $array, $path) {
$parts = explode('.', $path);
$tmp = $array;
foreach ($parts as $part) {
if (!isset($tmp[$part])) {
return ''; //Path is invalid
} else {
$tmp = $tmp[$part];
}
}
return $tmp; //If we reached this far, $tmp has the result of the path
}
所以你可以打电话:
$foo = getElementFromPath($array, 'four-legged.smart.worst');
echo $foo; // willy
如果您想编写元素,这并不难(您只需要使用引用,如果路径不存在,还需要进行一些检查以默认值)
编辑:由于这是在模板系统中,因此可能值得将数组向下“编译”到单个维度一次,而不是每次都遍历它(出于性能原因)
因此,这将转换为:
$animals = array(
'four-legged' => array (
'cute' => 'no',
'ugly' => 'no',
'smart' => array(
'best' => 'dog',
'worst' => 'willy'
)
),
'123' => '456',
'abc' => 'def'
);
进入
然后您的查找就变成了$value=isset($compiledArray[$path])$compiledArray[$path]:''
而不是$value=getElementFromPath($array,$path)代码>
它用预计算换取内联速度(循环内的速度).您尝试过什么?你有没有试过写一个表达式,用方括号和引号代替点?理论上是的。但是我的结果将是一个字符串,而不是一个有效的变量名。这将是“$a['four-legged']['smart']['best'].”@GWW如果你能帮忙的话,你真的不想做评估。@Byron,哦,我不是说评估。对不起,我以为他是先编译代码的。您应该试着看一看smarty模板引擎,它通过首先编译模板来实现这一点。模板系统是否足够聪明,能够区分您的预期结果和$a['four']-$legged['smart']['best']
?您尝试过什么?你有没有试过写一个表达式,用方括号和引号代替点?理论上是的。但是我的结果将是一个字符串,而不是一个有效的变量名。这将是“$a['four-legged']['smart']['best'].”@GWW如果你能帮忙的话,你真的不想做评估。@Byron,哦,我不是说评估。对不起,我以为他是先编译代码的。你应该试着看一看smarty模板引擎,它通过先编译模板来实现这一点。模板系统是否足够聪明,能够区分你的预期结果和$a['four']-$legged['smart']['best']
?出于好奇,你为什么要在那里进行is_数组检查?在哪里?在上面的代码中有两个is\u array
检查。。。你指的是哪一个(在setElementFromPath
中的一个还是在compileWithDots
中的一个)?我还注意到,设置一个元素会擦除所有其他元素。例如:setElementFromPath($animals,'four-legged.smart.best','roochie');setElementFromPath($animals,'四条腿。丑陋','是');抹掉鲁奇,啊,是的。这是因为它应该如何处理非数组?它应该与哪个键配对?因此,它不是生成空键(或数字键等),而是删除该值。否则,就没有真正好的明确的方式来处理碰撞。但我也测试了你正在拨打的确切电话,但对我来说没有(删除“roochie”)。。。你是否完全使用了我提供的代码?还是你修改了它?出于好奇,你为什么要在那里进行is_数组检查?在哪里?在上面的代码中有两个is\u array
检查。。。你指的是哪一个(在setElementFromPath
中的一个还是在compileWithDots
中的一个)?我还注意到,设置一个元素会擦除所有其他元素。例如:setElementFromPath($animals,'four-legged.smart.best','roochie');setElementFromPath($animals,'四条腿。丑陋','是');抹掉鲁奇,啊,是的。这是因为它应该如何处理非数组?它应该与哪个键配对?因此,它不是生成空键(或数字键等),而是删除该值。否则,就没有真正好的明确的方式来处理碰撞。但我也测试了你正在拨打的确切电话,但对我来说没有(删除“roochie”)。。。你是否完全使用了我提供的代码?还是你修改了它?