函数中的命名键不起作用

时间:2016-08-10 11:25:04

标签: php

我有一段PHP代码试图在函数中添加一个命名的key=>value对。它只是作为直接代码编写时工作正常(character_name和character_color是文件中正常工作的现有函数。他们只是从现有数据中提取字符串):

$name = character_name($character_id);
$color = character_color($character_id);
$array = array("character"=>$name, "color"=>$color);
$characters_array['character']=$array;

但是,当我尝试将其包装在函数中并将键值命名为变量时,它不再起作用并生成空值:

function character_array($key,$character_id) {
    $name = character_name($character_id);
    $color = character_color($character_id);
    $array = array("character"=>$name, "color"=>$color);
    $GLOBALS["characters_array"][$key]=$array;
}

我知道我的问题在于函数的最后一行,我怀疑这两组方括号是问题所在,但我不知道的是如何正确地写出最后一行,以便我可以在全局数组中添加一个名为key=>value的对。我哪里错了?

2 个答案:

答案 0 :(得分:0)

尝试使用函数内的全局变量的引用

function character_array($key,$character_id) {
   global $characters_array;
   $name = character_name($character_id);
   $color = character_color($character_id);
   $array = array("character"=>$name, "color"=>$color);
   $characters_array[$key]=$array;
}

答案 1 :(得分:0)

你有两个选项可以让它工作,但我会避免依赖全局变量。

我认为最好的方法是让函数返回您期望的数据,然后将其分配到您想要的位置。到目前为止,这是最清楚的事情:

function character_array($key,$character_id) {
    $name = character_name($character_id);
    $color = character_color($character_id);
    $array = array("character"=>$name, "color"=>$color);
    return $array;
}

//Assign it to the array by calling the function.
$GLOBALS["characters_array"] = character_array("foo", "bar");

另一种选择是将everthing作为参数传递。这将根据需要隐式分配数据

$GLOBALS["characters_array"]=[];

function character_array($key,$character_id, $characters_array) {
    $name = character_name($character_id);
    $color = character_color($character_id);
    $array = array("character"=>$name, "color"=>$color);
  $characters_array[$key]=$array;
}

character_array("foo", "bar", $GLOBALS["characters_array"]);

//This will still show nothing though
print_r($GLOBALS["characters_array"]);

请注意,上述print_r仍未显示数据。这是因为当传递数组PHP时会按值执行,即在函数中复制它,然后在退出该函数范围时销毁它。

为了让函数获取数组并对其执行任何操作,您需要通过引用传递。这在函数签名中很简单,您需要在变量前面添加&

//Notice the & infront of $characters_array
function character_array($key,$character_id, &$characters_array) {
    //code from above
}