3

我在 codeigniter 控制器中有一个方法,有时通过 url 调用,有时从控制器的另一个方法内部调用。当我在内部调用它时,我传递了一个参数数组。方法的简化版:

(在控制器内)

function get_details($args='') {

    if (isset($args['first_name'])) 
    {
        $first_name = $args['first_name'];
    } 
    else
    {
        $first_name = $this->uri->segment(3);
    } 

    ... do some other stuff ...

}

该方法被称为:

<domain>/<controller>/get_details/abcd/efgh 

或来自控制器的另一个功能:

$this->get_details(array('first_name'=>'abcd', 'last_name'=>'efgh'));

我期待当通过 url 调用该方法时, isset($args['first_name']) 将是错误的,但是似乎以这种方式调用的参数就在那里。我尝试打印一些东西,这就是我得到的:

print_r($args)  ---->   abcd

echo($args['first_name'])  ----> a

echo($args['whatever_index_I_use'])  ----> a  

似乎 url 的第三个参数正在传递给方法(通过 codeigniter?),但无法弄清楚为什么似乎设置了数组索引,我只能认为 php 正在将字符串转换为 int ,所以$args['whatever_index_I_use'], becomes $args[0]??

不知道这是一个codeigniter的事情还是我错过了php的微妙之处。

非常感谢任何可以解释发生了什么的人。

谢谢。

4

3 回答 3

4

我不知道这是错误还是预期行为,但在Strings 文档中有一条评论可以准确显示您遇到的情况。如果您使用字符串的文本和索引,它将返回第一个字符。为避免这种情况,首先检查参数是数组还是字符串:

if(is_array($args)) {
    echo($args['first_name']);
}
于 2012-05-09T15:58:14.717 回答
2

要完成@SérgioMichels 的回答,原因是 PHP 期望整数作为给定索引。当你给它一个字符串时,PHP 会将字符串转换为整数,并且假设字符串不是以数字开头,类型转换将返回 0,否则返回前导数字。

$str = 'abcdefghi';
var_dump($str['no_number']); // Outputs: string(1) "a"
var_dump($str['3something']); // Outputs: string(1) "d"
于 2012-05-09T22:03:11.337 回答
1

要专门回答您的问题 - 这将解决您的错误:

function get_details($args='') 
{
    if (is_array($args))
    {
        $first_name = $args['first_name'];
    } 
    else
    {
        $first_name = $this->uri->segment(3);
    } 
    ... do some other stuff ...
}

但是您的代码存在一些问题。首先,您声明您将该方法称为

<domain>/<controller>/get_details/abcd/efgh 

但是您不接受控制器中的“efgh”变量。为此,您需要将功能更改为

function get_details($first, $last) 

在这种情况下,您现在可以将函数调用为

$this->get_details('abcd', 'efgh');

现在你甚至不需要测试数组等,这是一个更好的解决方案 IMO。

如果您决定坚持使用数组,请更改:

$first_name = $this->uri->segment(3);

$first_name = $args;

因为根据定义 - $args 是第三个 URI 段。

于 2012-05-09T17:03:54.230 回答