我在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'])将为false,但似乎以这种方式调用参数。我尝试打印了几件事,这就是我得到的:
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。
非常感谢任何能够解释正在发生的事情的人。
感谢。
答案 0 :(得分:4)
我不知道这是一个错误还是一个预期的行为,但在Strings docs中有一条评论可以准确显示您的体验。如果您使用字符串的文本和索引,它将返回第一个字符。要避免它,首先检查参数是数组还是字符串:
if(is_array($args)) {
echo($args['first_name']);
}
答案 1 :(得分: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"
答案 2 :(得分: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是第3个URI段。