制作像zend一样的路由器

时间:2012-03-29 22:08:52

标签: php zend-framework

我有一个网址http:// * .com / branch / module / view / id / 1 / cat / 2 / etc / 3.

它变成了。

array
(
  'module'=>'branch',
  'controller'=>'module',
  'action'=>'view'
);

接下来我需要获得参数。 我有这个阵列。

/*function getNextSegments($n,$segments) {
    return array_slice ( $q = $this->segments, $n + 1 );
}
$params =   getNextSegments(3);
 */
 array ( 0 => 'id', 1 => '1', 2 => 'cat', 3 => '2', 4 => 'etc', 5 => '3' );//params

我想把它转换成这个: 排列 (   的 'id'=大于1,   “猫” =大于2,   “等” =→3, );

我如何使用php函数执行此操作。我知道我可以使用for或foreach,但我认为php有这样的功能,但我无法找到它:(。 谢谢。

  class A {
    protected function combine($params) {

        $count = count ( $params );
        $returnArray = array ();

        for($i = 0; $i < $count; $i += 2) {
            $g = $i % 2;
            if ($g == 0 or $g > 0) {
                if (isset ( $params [$i] ) and isset ( $params [$i + 1] ))
                    $returnArray [$params [$i]] = $params [$i + 1];
            }
        }
        return $returnArray;
    }

}

这很正常。如果有人有更好的逻辑,请帮助。 再次感谢你。

3 个答案:

答案 0 :(得分:1)

PHP没有内置函数。我只是用爆炸和循环来实现它,不应该那么难。

答案 1 :(得分:0)

我在扩展的Zend_Controller_Action类中使用了这样的函数。

public function getCleanParams()
{
    $removeElements = array(
        'module' => '',
        'controller' => '',
        'action' => '',
        '_dc' => ''
    );
    return array_diff_key($this->_request->getParams(), $removeElements);
}

这将以干净的方式和您想要的格式为您提供参数。

答案 2 :(得分:0)

您可以使用以下正则表达式(将文件命名为index.php)开始构建路由器:

<?php

$pattern = '@^(?P<module>branch)/'.
           '(?P<controller>module)/'.
           '(?P<action>view)'.
           '(:?/id[s]?/(?P<id>[0-9]+))?'.
           '(:?/cat[s]?/(?P<cat>[0-9]+))?'.
           '(:?/etc[s]?/(?P<etc>[0-9]+))?@ui';

preg_match($pattern, trim($_SERVER['REQUEST_URI'], '/'), $segment);

echo sprintf('<pre>%s</pre>', var_export($segment, true));

假设您安装了PHP 5.4.x,可以在命令行中键入以下内容:

% php -S localhost:8765

现在浏览http://localhost:8765/branch/module/view/id/1/cat/2/etc/3

输出将是(为清晰起见,删除除0以外的数字键):

array (
  0 => 'branch/module/view/id/1/cat/2/etc/3',
  'module' => 'branch',
  'controller' => 'module',
  'action' => 'view',
  'id' => '1',
  'cat' => '2',
  'etc' => '3',
)