【问题标题】:Getting PHP variable name as string for many variables获取 PHP 变量名作为许多变量的字符串
【发布时间】:2017-01-16 02:03:58
【问题描述】:

我已经搜索了很多主题,但目前还没有一个能帮助我满足我的特定需求。

我尝试了This Thread 的许多选项,但没有一个是完全正确的。

我正在为交换机和路由器制作配置生成器, 我正在尝试对其进行简化,因此我不会为每个接口都设置一个配置数组,而是为每种类型的布局设置一个配置数组,并将接口名称作为变量。 我有网页发布到脚本,我有页面发布每个帖子的端口布局,每个界面都作为自己的变量。

$fa1 = "DESKTOP";
$fa2 = "VOIP";
$fa3 = "DESKTOP";
$fa4 = "";
$fa5 = "DESKTOP";

等等。我正在尝试使用 foreach 循环来遍历每个接口(因此)

$ints = array($fa1,$fa2,$fa3,$fa4,etc);
foreach ($ints as $line) {
    if ($line == "PC") {
        file_put_contents($file, $pcarray.FILE_APPEND);
    }
    if ($line == "VOIP") {
        file_put_contents($file,$voiparray.FILE_APPEND);
    }
}

接口设置为数组:

$pcarray = array(
'interface ' .$interface,
'configetc'
);

我需要一个函数来获取接口变量的名称,以便将其分配给 $interface 变量。

到目前为止,我发现并尝试过的所有示例似乎都与类似值的变量不兼容。

即。对于上述情况,大多数人会为 DESKTOP 出现的所有内容返回 fa1,而不是为下一个桌面返回 fa3。

一个不太符合我要求的例子是:

function print_var_name($var) {
    foreach($GLOBALS as $var_name => $value) {
        if ($value === $var) {
            return $var_name;
        } 
    } 
    return false;
}

这个,对于每个变量值重复后的第一个刚刚返回的第一个变量名。

编辑: 我想要回来的是:

(as the written array)
interface fa1
standard desktop config
interface fa2
standard voip config
interface fa3
standard desktop config
interface fa5
standard desktop config

目前我在哪里:

interface fa1
standard desktop config
interface fa2
standard voip config
interface fa1
standard desktop config
interface fa1 
standard desktop config

【问题讨论】:

  • 你的问题不是很清楚,这可能是你有很多观点但没有回应的原因。我想我可以理解你试图做什么。所以要确认一下,在将变量名分配给$interface 变量时,您不想重复值吗?例如如果fa1 已经分配给DESKTOP,那么使用fa3?
  • 是的,没错,这个想法是为所有类似的接口使用一个模板,并且每次只分配接口值(在 foreach 循环内),这样它将先使用 fa1,然后是 fa2,然后是 fa3但是选择接口的名称,以便它只分配具有值的接口。 IE。如果 fa5 未使用,但 fa6 是桌面,它只会跳过 fa5(该部分对我有用),就像其他所有方法一样,我发现了针对该值的引用,这使得它每次出现时都保持 fa1跨桌面价值

标签: php function


【解决方案1】:

我不确定这是否是您所追求的,但在下面的示例中,我刚刚创建了一个foreach() 循环来检查来自$ints[] 的数组值是否为真。如果是这样,则将变量名称和值添加到 $varArr 数组。所以新数组看起来像["fa1" => "DESKTOP", "fa2" => "VOIP"]。然后循环遍历这个新数组并使用 Switch 比较值。请注意,$fa4 已被故意忽略,但如果需要,您可以轻松添加它并使用默认情况进行测试。

$fa1 = "DESKTOP";
$fa2 = "VOIP";
$fa3 = "DESKTOP";
$fa4 = "";
$fa5 = "DESKTOP";

$ints = [$fa1,$fa2,$fa3,$fa4,$fa5];
$varArr; //Variable Name Array

foreach($GLOBALS as $k=>$v) { //Looping through Globals

    if(in_array($v, $ints) && $v !== "") { //If value is in $ints array, add to this array

        $varArr[$k] = $v;
    }  
}

foreach ($varArr as $k=>$v) { //Create Interface File

    file_put_contents($file, "interface ". $k ."\n", FILE_APPEND);

    switch($v) {
        case "DESKTOP":
            file_put_contents($file, "standard desktop config\n", FILE_APPEND);
            break;
        case "VOIP":
            file_put_contents($file, "standard voip config\n", FILE_APPEND);
            break;
    }    
}

输出:

interface fa1
standard desktop config
interface fa2
standard voip config
interface fa3
standard desktop config
interface fa5
standard desktop config

【讨论】:

  • 我不得不在文件 put 内容周围添加一个 if 块,以便接口行计算所有已设置为全局变量的 post 值,但是一旦我这样做了,它就很好地工作了,谢谢。 if($k != "DESKTOP && $k != "VOIP") { file_put contents($file, "Interface ".$k ."\n", FILE_APPEND); } 此外,由于接口名称为 FastEthernet0/X,我在其上方放置了一个开关块,但它的工作原理与我希望的完全一样。再次感谢:)
  • 这很好用,一个问题,我添加了接口描述的功能,每个接口都添加了它。有没有办法让 foreach 运行两个数组? IE。如果它是 voip,我有联系号码的描述,联系号码发布为接口 + des(即 $fa02des、$fa03des 等)如果它是一台计算机,它没有得到描述,所以我希望它应用适合该端口的配置级别的描述,(变量在 $voiparray 中解决)或者这太难了,我应该为每个端口单独使用一个开关/机箱?
  • 嗨,克雷格,如果您发布另一个带有示例输出的问题,我可以帮您看看。我不会说它不可能或太难,它只是掌握你需要什么的逻辑。发布后,只需使用指向您的新问题的链接评论我的答案即可。
【解决方案2】:

您无法按照您尝试的方式获取变量名。如果需要保留 var 名称,则应改为传递要查看的变量名称列表。然后,生成内容的函数将只使用数组中的内容。

像这样简单的东西会给你变量的值和它的名字($varname 在 foreach 循环中)。 (我不知道 $file、$pcarray 和 $voiparray 是从哪里来的,所以它们只是示例函数中的全局变量):

$list = ["fa1", "fa2", "fa3", "fa4", "fa5"];
PutFileContentList($list);
function PutFileContentList(array $list) {
    globals $file, $pcarray, $voiparray;
    foreach ($list as $varname) {
        $line = isset($GLOBALS[$varname]) ? $GLOBALS[$varname] : "";
        if ($line == "PC") {
            file_put_contents($file, $pcarray . FILE_APPEND);
        }
        if ($line == "VOIP") {
            file_put_contents($file, $voiparray . FILE_APPEND);
        }
    }
}

【讨论】:

  • $file 是它写入的文件,否则指定,认为没有必要这样做,对于 voip 和 pc 数组也是如此,它们只是配置文件的数组。我会试一试,谢谢
  • 试过了,它没有传递 varname,所以 $GLOBALS[$varname] 实际上是在搜索 $varname 的全局变量,而不是变量的实际名称。
  • 列表是变量名的列表,因为在PHP中无法获取变量名。
  • 是的,我明白了,但是如果我让它 echo $GLOBALS[$varname] (在 foreach 循环中)它只会一遍又一遍地回显“varname not set”。
猜你喜欢
  • 2013-08-27
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
相关资源
最近更新 更多