PHP - 通过循环使用变量填充数组

时间:2014-01-27 23:16:48

标签: php arrays loops

我想将变量(这些变量的值)放入数组中。我有类似的变量名称,所以我尝试找到一个基于循环的解决方案,它提供相同的输出:

$str1 = "one";
$str2 = "two";
$str3 = "three";

$arr = array($str1, $str2, $str3);
foreach ($arr as $key => $value){
    echo "[", $key, "] = ", $value, "<br/>";
}

对于基于循环的解决方案,我尝试了这种方式,但它不允许将值插入到数组中:

$str1 = "one";
$str2 = "two";
$str3 = "three";

function arrayDefine($varName, $max) {
    for ($i = 1; $i <= $max; ++$i){
        echo "$", $varName, $i;
        if ($i < $max){
            echo ", ";
        }
    }
}

$arrItems = arrayDefine(str, 3);
$arr = array($arrItems);
foreach ($arr as $key => $value){
    echo "[", $key, "] = ", $value, "<br/>";
}

第一个代码块的输出是:

[0] = one
[1] = two
[2] = three

但第二个显示:

$str1, $str2, $str3[0] = 

为了获得与第一个(非基于循环的)解决方案相同的结果,我应该更改/使用什么?

4 个答案:

答案 0 :(得分:3)

您需要了解的第一件事是将一些信息打印到输出(例如echo)和为变量赋值。

您的函数只是将变量名称输出到输出。但是,这些是字符串。程序运行后,String不等于一段代码。这是任何编程的基础知识,除非变量对您完全清楚,否则不得尝试做任何事情。

使用$GLOBALS

现在是一个解决方案。由于您的变量是全局,您可以通过php的$GLOBALS数组访问它们。这看起来像这样:

$str1 = "a";
$str2 = "b";
$str3 = "c";

function createArray($name, $count) {
    $return_array  = array();
    for($i=0; $i<$count; $i++) {
        $return_array[$name.($i+1)] = $GLOBALS[$name.($i+1)];
    }
    return $return_array;
} 

print_r(createArray("str", 3));

一般来说,你所做的是荒谬的。如果您不想存储一些数据以便可以访问所有数据,请从数组开始:

array("a", "b", "c");
or
array("str1"=>"a", ...);

使用eval()

此外,许多初学者倾向于喜欢“ evil ”功能。你也可以这样做。 eval()字符串转换为一段代码。但是,它总是一个糟糕的解决方案,当我学习更多关于编程的知识时,我总是学到更好的解决方案。但是,你从一开始就无法了解所有内容,所以这里有一种如何生成最危险和最不安全的代码的方法:

function createArray($ name,$ count){         $ return_array = array();         for($ i = 0; $ i

这非常危险,会造成麻烦。

使用$$语法

我认为$$方法proposed by ManiacTwister是最好的。您甚至可以将复杂的字符串转换为变量:

echo ${"static_text" . $string};

然而,再次,为什么不使用数组?此功能应用于调试目的。

关于变量范围的注释。

但是, variable scopes 可能会造成混淆,请参阅示例:

$x = 666;
function printvar($name) {
     global $$name;  //Get the variable from global scope t the function scope
     echo $$name; //if $name = "x" this evaluates into echo $x
     echo "\n";  //New line
}
printvar("x");  //Prints 666


function aFunction() {
    $x = 13;  //This $x only exists betvween {} and has nothing to do with global $x = 666
    printvar("x");  //Still prints 666!
}

答案 1 :(得分:2)

即使不是最佳做法,也应该有效:

$str1 = "one";
$str2 = "two";
$str3 = "three";

function arrayDefine($varName, $max) {
    $items = array();
    for ($i = 1; $i <= $max; ++$i){
        $var = $varName.$i;
        global $$var;
        $items[$i] = $$var;
    }
    return $items;
}

$arr= arrayDefine('str', 3);
foreach ($arr as $key => $value){
    echo "[", $key, "] = ", $value, "<br/>";
}

答案 2 :(得分:1)

function arrayFunction()
{
    $str1 = "one";
    $str2 = "two";
    $str3 = "three";
    $array = array($str1, $str2, $str3);


    foreach ($array as $key=>$value) {
        echo "[", $key, "] = ", $value, "<br/>";

    }

}

arrayFunction();

答案 3 :(得分:0)

我认为这会奏效:

$str1 = 'one';
$str2 = 'two';
$str2 = 'three';

for($i=1;$i<100;$i++){
  $varName = 'str' . $i;
  $returnArray[$varName] = $$varName;
}

但是,如果你正在创建一个函数,请记住它不能访问$ str1,$ str2等...因为它们在GLOBAL范围内,而不是函数范围(并且与大多数语言不同? !(至少我知道的))除非你说“全球”,否则GLOBAL在函数中是不可访问的。

所以你需要使用Tomas'代码。