【问题标题】:PHP array empty outside of function [duplicate]PHP数组在函数之外为空[重复]
【发布时间】:2014-01-02 01:31:03
【问题描述】:
<?php
echo '<pre>';
error_reporting(E_ALL);

$pid = '129';

$families = array
(
      "Griffin"=>array
                      (
                      "PTY"=>"Peter",
                      "STY"=>"X",
                      "QTY"=>"A|F"
                      ),
      "Quagmire"=>array
                      (
                      "NTY"=>"Glenn"
                      ),
      "Brown"=>array
                  (
                  "FTY"=>"Cleveland",
                  "OTY"=>"Q|G|T|Y",
                  "PTY"=>"Junior"
                  )
);

global $allid;

$allid = array();
function buildid($pid,$key,$val){

    if (preg_match("/\|/",$val)){
        $val = explode("|",$val);
            foreach($val as $val1){
                $id = $pid.'-'.$key.'-'.$val1;
                $allid[] = $id;

            }
    }
}

print_r($allid);  

foreach($families as $familieskey=>$familiesvalue){
    foreach($familiesvalue as $skey=>$sval){
        buildid($pid,$skey,$sval);
    }
}
echo '</pre>';
?>

上述代码的预期输出:

案例1:

   Array
    (
        [0] => 129-QTY-A
        [1] => 129-QTY-F
    )
    Array
    (
        [0] => 129-OTY-Q
        [1] => 129-OTY-G
        [2] => 129-OTY-T
        [3] => 129-OTY-Y
    )

案例2:

 Array
    (
      [0] => 129-QTY-A
      [1] => 129-QTY-F
      [2] => 129-OTY-Q
      [3] => 129-OTY-G
      [4] => 129-OTY-T
      [5] => 129-OTY-Y
    )

【问题讨论】:

  • 使用不同逻辑的相同代码也可能是重复的?

标签: php arrays function global-variables scope


【解决方案1】:

global $allid; 进入函数本身,而不是外部,即

   function buildid($pid,$key,$val){
        global $allid;
        if (preg_match("/\|/",$val)){
    ...

documentation 指出

在函数外部使用global 关键字不是错误。如果文件包含在函数内部,则可以使用它。

--> 除非你在函数中包含它,否则它没有任何作用。

编辑添加:您还需要在运行代码后放置print_r(即在echo '&lt;/pre&gt;';之前) - 目前,您在初始化后立即显示数组的内容,然后填充它与数据,然后你的程序结束。

【讨论】:

  • 不,它不起作用。我得到一个空数组!
  • 刚刚注意到还有一个额外的问题:您首先执行 print_r,然后您实际运行代码。您需要将 print_r 放在代码的 end 处。
【解决方案2】:

您在设置其值之前输出数组。所以代码应该是这样的。 您的函数 buildid() 已定义但在输出数组之前未调用。 所以 print_r($allid);应该在它的值被填充到 foreach 循环之后调用。

<?php
echo '<pre>';
error_reporting(E_ALL);

$pid = '129';

$families = array
(
    "Griffin"=>array
    (
        "PTY"=>"Peter",
        "STY"=>"X",
        "QTY"=>"A|F"
    ),
    "Quagmire"=>array
    (
        "NTY"=>"Glenn"
    ),
    "Brown"=>array
    (
        "FTY"=>"Cleveland",
        "OTY"=>"Q|G|T|Y",
        "PTY"=>"Junior"
    )
);

$allid = array();

function buildid($pid,$key,$val){
     //Global should be inside function like this.
    global $allid;
    if (preg_match("/\|/",$val)){
        $val = explode("|",$val);
        foreach($val as $val1){
            $id = $pid.'-'.$key.'-'.$val1;
            $allid[] = $id;

        }
    }
}

foreach($families as $familieskey=>$familiesvalue){
    foreach($familiesvalue as $skey=>$sval){
        buildid($pid,$skey,$sval);
    }
}
print_r($allid);
echo '</pre>';
?>

【讨论】:

  • 对不起,伙计! Jan Schejbal 已经回复了
【解决方案3】:

首先。在将数据设置到此数组之前,您先创建print_r($allid)。你只在“foreach($families as $familieskey=&gt;$familiesvalue){...”]

第二次完成。

试试

error_reporting(E_ALL);

$pid = '129';

$families = array
(
      "Griffin"=>array
                      (
                      "PTY"=>"Peter",
                      "STY"=>"X",
                      "QTY"=>"A|F"
                      ),
      "Quagmire"=>array
                      (
                      "NTY"=>"Glenn"
                      ),
      "Brown"=>array
                  (
                  "FTY"=>"Cleveland",
                  "OTY"=>"Q|G|T|Y",
                  "PTY"=>"Junior"
                  )
);


function buildid($pid,$key,$val){
 global $allid;
    if (preg_match("/\|/",$val)){
        $val = explode("|",$val);
            foreach($val as $val1){
                $id = $pid.'-'.$key.'-'.$val1;
                $allid[] = $id;

            }
    }
}



foreach($families as $familieskey=>$familiesvalue){
    foreach($familiesvalue as $skey=>$sval){
        buildid($pid,$skey,$sval);
    }
}


print_r($allid); 

【讨论】:

  • 你可以换个说法,你的答案不清楚!
猜你喜欢
  • 2020-04-01
  • 2017-06-14
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2020-01-11
相关资源
最近更新 更多