【问题标题】:PHP - populate an array with variables by loopPHP - 通过循环使用变量填充数组
【发布时间】:2014-01-27 23:16:48
【问题描述】:

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

$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] = 

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

【问题讨论】:

  • 嗯...它不会将值插入到数组中,因为您没有使用这些值创建数组。你所有的功能就是回显一些东西。如果需要,您必须实际创建一个数组并返回它。

标签: php arrays loops


【解决方案1】:

首先需要了解的是,将一些信息打印到输出(例如echo)和为变量赋值之间的区别。

您的函数只是将变量名称打印到输出。但是,这些是字符串。程序运行后,字符串不等于一段代码。这是任何类型编程的基础,在您完全清楚变量之前,您不得尝试做任何事情。

使用$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()

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

函数 createArray($name, $count) { $return_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!
}

【讨论】:

  • 我正在写同样的东西。我同意任何不了解字符串和变量之间区别的人都应该停止他们正在做的事情并首先进行自我教育。
  • 几周前我开始学习 PHP 作为我的第一门编程语言。 :)
  • 除了编程之外,没有其他学习编程的方法,但是在你开始做除1+1=2之外的任何事情之前,必须清楚一些基础知识。
【解决方案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/>";
}

【讨论】:

  • 不幸的是,由于范围问题,您必须使用全局变量来执行该功能。 “不是最佳实践”反对“使用你的想法的唯一方法”通常意味着“找到更好的想法”。
  • 不知道为什么这被否决了。除非它不起作用。
【解决方案3】:
function arrayFunction()
{
    $str1 = "one";
    $str2 = "two";
    $str3 = "three";
    $array = array($str1, $str2, $str3);


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

    }

}

arrayFunction();

【讨论】:

  • 是的,我知道你在那里做了什么。
【解决方案4】:

我认为这会奏效:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    相关资源
    最近更新 更多