foreach 循环中的 PHP 变量变量不起作用

PHP variable variables in a foreach loop aren't working

提问人:user26676 提问时间:3/20/2014 最后编辑:user26676 更新时间:3/20/2014 访问量:713

问:

如果我能让它工作,这是一个绝妙的小技巧 - 我有来自数十个表的数百个数据列,分布在十几个数据表单中(它们是 HTML 打印表单),它们都是带有嵌入式 php 变量的 html。很正常。但是,客户需要知道哪个字段进入了哪里 - 这是一个很好的问题。

那我做了什么?我研究了一个解决方案,允许数据库中的键数组放弃它们的列名。绝妙的举动!除了我需要通过变量来做到这一点,你猜怎么着,它们不能在 foreach 循环中工作。

代码如下

   if ($_REQUEST['data']=="false"){
        $supera = array("RowService", "RowSite", "RowCustomer", "RowEngineer"); //there can be many of these they are key'd arrays $RowService['column_name_1']; is the format
        foreach($supera as $super){
            foreach(${$super} as $key=>$value){
                if (!is_numeric($key)){
                    ${$super}[$key] = "<span style=\"color:pink;\">".$key."</span>";
                }
            }
        }
    }

正如你所看到的,我想要一个终止开关的简单机制来剪切和粘贴键数组,这些数组不再显示真实数据,而是显示(粉红色)列名,(也许)表名。已经有很多代码,如果它可以工作,这将是一个绝妙的选择

编辑:这是PHP错误:

 Warning: Invalid argument supplied for foreach()

编辑:代码实际上已经起作用:修复是测试is_array()

 if(is_array(${$super})) foreach(${$super} as $key=>$value){

会起作用,而不仅仅是

 foreach(${$super} as $key=>$value){
php foreach 变量

评论

0赞 sush 3/20/2014
尝试更改 ${$supera} 为 $supera
0赞 user26676 3/20/2014
感谢。。是个错别字。.已经看过了
0赞 PravinS 3/20/2014
根据你的数组,你不需要两个 foreach,你也没有在$supera数组中显示键
0赞 user26676 3/20/2014
@PravinS不,它们是现有的数据填充数组,例如:$RowService['my_column'] 已经存在,$RowService['my_other_column'] 和 $RowSite['different_column'] 等乘以大约 100
0赞 moonwave99 3/20/2014
将数据收集到一个数组中,并在不带变量的情况下对其进行迭代 - 甚至更加出色

答:

0赞 Niet the Dark Absol 3/20/2014 #1

就我个人而言,我发现变量是一个非常糟糕的主意。有几种方法可以解决它。

例如:

$process = array(&$RowService,&$RowSite,&$RowCustomer,&$RowEngineer);
foreach($process as $p) {
    foreach($p as $k=>$v) {
        $p[$k] = "<span style=\"color:pink\">".$v."</span>";
    }
}

使用引用意味着您可以影响原始变量。

如果上述方法不起作用(我对参考 XD 不是很好),请尝试以下操作:

$process = array($RowService,$RowSite,$RowCustomer,$RowEngineer);
foreach($process as $p) {
    foreach($p as $k=>$v) {
        $p[$k] = "<span style=\"color:pink\">".$v."</span>";
    }
}
list($RowService,$RowSite,$RowCustomer,$RowEngineer) = $process;

评论

0赞 user26676 3/20/2014
你是对的,使用指针可能是正确的方法,我对它们非常熟悉,你是对的。&$
0赞 user26676 3/20/2014
第一个不起作用 - 被相同的错误消息轰炸 - 一定是 foreach 逻辑中的 PHP 故障,或者(然而它只是发生在我身上,遵循完全不同的思路)也许这是一个误解 - 这是我在循环中分配 while 的结果$val[$key]
1赞 slash197 3/20/2014 #2

我不确定你想实现什么,但你的代码(简化)工作得很好:

$a = array("asd", "qwe");
$asd = array("a" => 1, "b" => 2, "c" => 3);
$qwe = array("d" => 4, "e" => 5, "f" => 6);

foreach ($a as $item)
{
    foreach ($$item as $key => $value)
    {
        echo $key . ": " . $value . "<br />";
    }
}

输出:

a: 1
b: 2
c: 3
d: 4
e: 5
f: 6

很可能你的一个变量是空的(不是数组),这就是你收到该警告的原因。

评论

0赞 user26676 3/20/2014
是的,你是对的,在嵌套的foreach前面添加,做到了if(is_array(${$super}))
0赞 user26676 3/20/2014
顺便说一句,这是一个地狱般的把戏。意味着无数的打印表单可以打印/打印他们使用的字段名称,而不是里面的数据。这么一点点的想法就取得了巨大的胜利。意味着用户不会猜测哪个字段是什么,即他们可以点击帮助按钮。所以代码不受影响
0赞 payal 3/20/2014 #3
As per my understanding of your requirement.

If you want to get table name with pink color then you just need to use below code 

$supera = array("RowService", "RowSite", "RowCustomer", "RowEngineer"); //there can be many of these they are key'd arrays $RowService['column_name_1']; is the format
$super = array();
        foreach($supera as $key=>$value){
                if (!is_numeric($value)){
                    $super[$value] = "<span style=\"color:pink;\">".$value."</span>";
                }
        }
        print_r($super);