Named params no Code Igniter

Named params são parâmetros enviados numa url, mas sem ordem definida. Na prática são o velho ?var=valor&var2=valor2, mas de um modo mais limpo.

www.seusite.com/controller/método/nome:Felipe/cidade:Teutônia/

Eu venho utilizando CodeIgniter há algum tempo e ele não permite passar variáveis como o PHP normalmente faz e acabei criando algo assim para utilizar. E quando li o artigo do Tulio Faria falando sobre named params, mas no CakePHP, a primeira coisa que pensei é que deveria disponibilizar minha função aqui no blog.

Na verdade é uma estensão da biblioteca URI:

class MY_URI extends CI_URI {
  function named_param($var) {
    $arr = $this->segment_array();
      foreach ($arr as $value) {
        if ($var == substr($value, 0, strpos($value, ':'))) {
          return substr($value, strpos($value, ':')+1);
        }
      }
    return null;
  }
}

Para chamar essa função faça da seguinte maneira:

    $this->uri->named_param('nome'); // Na url de exemplo acima retornaria Felipe
    $this->uri->named_param('cidade'); // Na url de exemplo acima retornaria Teutônia

Update:

Conversando o Guilherme Medeiros, chegamos a uma solução diferente da de cima. Nesta versão não se chama uma função que retornará o valor, mas sim os valores já estão na variável named, ficando a classe assim:

class MY_URI extends CI_URI {
  var $named;

  function MY_URI() {
    parent::CI_URI();

    $uri = $this->segment_array();
    foreach($uri as $val) {
      if (strpos($val, ':')) {
        $this->named->{substr($val, 0, strpos($val, ':'))} = substr($val, strpos($val, ':')+1);
      }
    }
  }
}

Sendo usado assim:

  $this->uri->named->nome; // Na url de exemplo acima retornaria Felipe
  $this->uri->named->cidade; // Na url de exemplo acima retornaria Teutônia

Vale lembrar que o valor deve ser testado com o isset(), pois pode não existir.