Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在模板中调用多维关联数组_Php - Fatal编程技术网

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”)。。。你是否完全使用了我提供的代码?还是你修改了它?